Liste des Groupes | Revenir à co vms |
On 2/14/2025 2:02 PM, Simon Clubley wrote:But I like this version better:It also
doesn't help you with the main problem I mentioned, which is parsing
and validating the filter syntax.How would you turn the list of filters, each with their own syntax, intoI think that can be define in CLD.
something that can be validated by DCL ? As a reminder, it is critical
that the filters are available to the program in the order they were
specified on the command line.
$ type fun4.cld
define verb fun4
image "sys$disk:[]fun4"
parameter p1, value(type=$file, list, required)
qualifier filter, value(type=filter_type, list, required), placement=local
define type filter_type
keyword filtera, value(type=filtera_type, list, required)
keyword filterb, value(type=filterb_type, list, required)
define type filtera_type
keyword a1, value(type=$number, required)
keyword a2, value(type=$number, required)
keyword x, value(type=$number, required)
define type filterb_type
keyword b1, value(type=$number, required)
keyword b2, value(type=$number, required)
keyword x, value(type=$number, required)
$ type fun4.pas
[inherit('sys$library:pascal$cli_routines')]
program fun4(input,output);
type
pstr = varying [255] of char;
filter_type = (filtera, filterb);
var
filter_list : array [1..100] of filter_type;
fnm, filter, a1, a2, b1, b2, x : pstr;
nfilters, i : integer;
begin
while odd(cli$get_value('P1', fnm.body, fnm.length)) do begin
write(fnm);
nfilters := 0;
while odd(cli$get_value('FILTER', filter.body, filter.length)) do begin
nfilters := nfilters + 1;
if index(filter, 'FILTERA') = 1 then
filter_list[nfilters] := filtera
else if index(filter, 'FILTERB') = 1 then
filter_list[nfilters] := filterb
else
halt;
end;
for i := 1 to nfilters do begin
write(' ', filter_list[i]);
case filter_list[i] of
filtera:
begin
write(' filtera');
cli$get_value('FILTERA.A1', a1.body, a1.length);
write(' a1=', a1);
cli$get_value('FILTERA.A2', a2.body, a2.length);
write(' a2=', a2);
cli$get_value('FILTERA.X', x.body, x.length);
write(' x=', x);
end;
filterb:
begin
write(' filterb');
cli$get_value('FILTERB.B1', b1.body, b1.length);
write(' b1=', b1);
cli$get_value('FILTERB.B2', b2.body, b2.length);
write(' b2=', b2);
cli$get_value('FILTERB.X', x.body, x.length);
write(' x=', x);
end;
end;
end;
writeln;
end;
end.
$ pas fun4
$ lin fun4
$ set comm fun4
$ fun4 f1.dat/ filter=(filtera=(a1:12,a2:34,x:1234),filterb=(b1:56,b2:78,x:5678)),-
f2.dat/filter=(filterb=(b2:87,b1:65,x:8765),filtera=(a2:43,a1:21,x:4321))
f1.dat FILTERA filtera a1=12 a2=34 x=1234 FILTERB filterb b1=56 b2=78 x=5678
f2.dat FILTERB filterb b1=65 b2=87 x=8765 FILTERA filtera a1=21 a2=43 x=4321
Les messages affichés proviennent d'usenet.