home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD2.iso / Misc / VIDEOTEXT.LZX / VTsrc / startup.p < prev    next >
Encoding:
Text File  |  1996-02-26  |  9.5 KB  |  294 lines

  1. UNIT startup; {$project vt }
  2. { Wertet die Programmstartargumente für VideoText aus }
  3. { ToolTypes:                  CLI-Parameter:  }
  4. { FILE=<output name>          -f=<output name> }
  5. { FILEMODE=<flag>|<flag>|...                   }
  6. { ICONPATH=<pathname>         -i=<pathname> }
  7. { EDITOR=<dos command>        -e=<dos command> }
  8. { CONFIGPATH=<pathname>       -c=<pathname> }
  9. { PALETTE=<rgb>,<rgb>,...     -p<rgb>,<rgb>,... }
  10. { MAXWAIT=<seconds>           -w<seconds> }
  11. { BUSDELAY=<counter>          -d<counter> }
  12. { BURST=<tics>                -b<tics> }
  13. { SHUFFLE=<tics>              -s<tics> }
  14. { FLAGS=<flag>|<flag>|...              }
  15. {                             <page> <page> ... }
  16. {                             <file> <file> ... }
  17.  
  18. INTERFACE; FROM vt USES jobs;
  19.  
  20. VAR testing: Boolean;
  21.  
  22. FUNCTION write_to_icon: Boolean;
  23. PROCEDURE get_args;
  24.  
  25. { ---------------------------------------------------------------------- }
  26.  
  27. IMPLEMENTATION;
  28.  
  29. {$opt q,s+,i+ } { keine Laufzeitprüfungen außer Stack und Feldindizes }
  30. {$incl "workbench/startup.h", "icon.lib", "dos.lib" }
  31. {$incl "exec.lib", "dos/dosextens.h" }
  32.  
  33. TYPE keyid=(fil,flm,icp,edi,cfp,pal,mxw,bdl,bst,shu,flg,
  34.             asc,vtx,ovw,apd,ics,nic,num,nnm,fif,lif,clk);
  35.      keywords=ARRAY[keyid] OF Str;  { s. Inititalisierungsteil }
  36.  
  37. VAR mypath,homedir: BPTR;
  38.     myname,colors: str80;
  39.     busdelay: Integer;
  40.     hail: p_WBStartup;
  41.     arg: p_WBArg;
  42.     pr: ^Process;
  43.     mycli: ^CommandLineInterface;
  44.     s: ^String[1000];
  45.     keys,ttarry: keywords;
  46.     ttypes: ARRAY[fil..flg] OF str80; STATIC;
  47.  
  48. PROCEDURE read_from_icon;
  49. { Startparameter lesen }
  50. VAR icon: p_DiskObject;
  51.     entry: Str;
  52.     olddir: BPTR;
  53.     ok: Integer;
  54.     key,key2: keyid;
  55. BEGIN
  56.   IF IconBase=Nil THEN Exit;
  57.   olddir := CurrentDir(mypath);
  58.   icon := GetDiskObject(myname);
  59.   IF icon<>Nil THEN BEGIN
  60.     FOR key := fil TO flg DO BEGIN
  61.       entry := FindToolType(icon^.do_ToolTypes, keys[key]);
  62.       IF Ptr(entry)<>Nil THEN CASE key OF
  63.         fil: outputname := entry;
  64.         flm: FOR key2 := asc TO nnm DO
  65.           IF MatchToolValue(entry,keys[key2]) THEN CASE key2 OF
  66.             asc: asciifile := True;
  67.             vtx: asciifile := False;
  68.             ovw: overwrite := True;
  69.             apd: overwrite := False;
  70.             ics: withicon := True;
  71.             nic: withicon := False;
  72.             num: numbering := True;
  73.             nnm: numbering := False;
  74.             OTHERWISE;
  75.           END;
  76.         icp: iconpath := entry;
  77.         edi: editor := entry;
  78.         cfp: configpath := entry;
  79.         pal: colors := entry;
  80.         mxw: Val(entry,maxwait,ok);
  81.         bdl: Val(entry,busdelay,ok);
  82.         bst: Val(entry,burst,ok);
  83.         shu: Val(entry,shuffle,ok);
  84.         flg: FOR key2 := fif TO clk DO
  85.           IF MatchToolValue(entry,keys[key2]) THEN CASE key2 OF
  86.             fif: fifo := True;
  87.             lif: fifo := False;
  88.             clk: testing := True;
  89.             OTHERWISE;
  90.           END;
  91.         OTHERWISE;
  92.       END;
  93.     END;
  94.     FreeDiskObject(icon);
  95.   END;
  96.   olddir := CurrentDir(olddir);
  97. END;
  98.  
  99. FUNCTION write_to_icon{: Boolean};
  100. { aktuelle Parameter ins Icon zurückschreiben }
  101. VAR icon: p_DiskObject;
  102.     olddir: BPTR;
  103.     s1: str80;
  104.     j: Integer;
  105.     key: keyid;
  106. BEGIN
  107.   write_to_icon := False;
  108.   IF IconBase=Nil THEN Exit;
  109.   olddir := CurrentDir(mypath);
  110.   icon := GetDiskObject(myname);
  111.   IF icon<>Nil THEN BEGIN
  112.     FOR key := fil TO clk DO ttarry[key] := Nil;
  113.     icon^.do_ToolTypes := ^ttarry;
  114.     { Informationen auf neuesten Stand bringen: }
  115.     getpalette; colors := ''; FOR j := 0 TO 7 DO 
  116.       colors := colors + hexstr(palette[j],3)+',';
  117.     IF I2CBase<>Nil THEN
  118.       busdelay := SetI2CDelay(I2CDELAY_READONLY);
  119.     { Ausgabetexte erzeugen: }
  120.     FOR key := fil TO flg DO BEGIN
  121.       s1 := keys[key]+'=';
  122.       CASE key OF
  123.         fil: s1 := s1 + outputname;
  124.         flm: BEGIN
  125.             IF asciifile THEN s1 := s1 + keys[asc] + '|'
  126.               ELSE s1 := s1 + keys[vtx] + '|';
  127.             IF overwrite THEN s1 := s1 + keys[ovw] + '|'
  128.               ELSE s1 := s1 + keys[apd] + '|';
  129.             IF withicon THEN s1 := s1 + keys[ics] + '|'
  130.               ELSE s1 := s1 + keys[nic] + '|';
  131.             IF numbering THEN s1 := s1 + keys[num]
  132.               ELSE s1 := s1 + keys[nnm];
  133.           END;
  134.         icp: s1 := s1 + iconpath;
  135.         edi: s1 := s1 + editor;
  136.         cfp: s1 := s1 + configpath;
  137.         pal: s1 := s1 + colors;
  138.         mxw: s1 := s1 + IntStr(maxwait);
  139.         bdl: s1 := s1 + IntStr(busdelay);
  140.         bst: s1 := s1 + IntStr(burst);
  141.         shu: s1 := s1 + IntStr(shuffle);
  142.         flg: BEGIN
  143.             IF fifo THEN s1 := s1 + keys[fif]
  144.               ELSE s1 := s1 + keys[lif];
  145.             IF testing THEN s1 := s1 + '|' + keys[clk];
  146.           END;
  147.         OTHERWISE;
  148.       END;
  149.       ttypes[key] := s1;
  150.       ttarry[key] := ttypes[key];
  151.     END;
  152.     write_to_icon := PutDiskObject(myname,icon);
  153.     FreeDiskObject(icon);
  154.   END;
  155.   olddir := CurrentDir(olddir);
  156. END;
  157.  
  158. PROCEDURE paraminfo;
  159. { kurze Info für CLI-Benutzer }
  160. BEGIN
  161.   WriteLn('legal parameters:');
  162.   WriteLn(myname,' <page> <page> ... <file> <file> ...');
  163.   WriteLn('  -f=<outputfile> -i=<iconpath> -c=<configpath> -e=<editcommand>');
  164.   Write('  -d<delaycount> -w<seconds> -b<frames> -s<frames> -p<rgb>,<rgb>,...');
  165.   { Irgendwer erzeugt mir nach Halt() noch zwei extra LF's ... }
  166. END;
  167.  
  168. PROCEDURE get_args;
  169. { wertet CLI- oder WorkBench-Argumente aus }
  170. VAR len,i,j,k,ok,gelesen: Integer;
  171.     name: str80;
  172.     is_job: Boolean;
  173.     olddir: BPTR;
  174. BEGIN
  175.   gelesen := 0;
  176.   busdelay := -1;
  177.   colors := '';
  178.   read_from_icon;
  179.   IF fromWB THEN BEGIN    { *** Workbench-Start }
  180.     hail := StartupMessage;
  181.     arg := hail^.sm_ArgList;
  182.     FOR i := 1 to hail^.sm_NumArgs DO BEGIN
  183.       IF i>1 THEN BEGIN  { zusätzliche Dateien: enthaltene Seiten einlesen }
  184.         olddir := CurrentDir(arg^.wa_Lock);
  185.         name := arg^.wa_Name;
  186.         IF filetype(name)=1 THEN
  187.           gelesen := gelesen + getpages(name,True);
  188.       END;
  189.       { auf nächsten WBArg-Zeiger zugreifen: }
  190.       arg := Ptr(Long(arg)+SizeOf(WBArg));
  191.     END;
  192.   END ELSE IF ParameterLen>0 THEN BEGIN    { *** CLI-Start }
  193.     s := ParameterStr; len := ParameterLen;
  194.     { Parameterzeile in Worte zerlegen, wie der argv[] in C es schon ist :-( }
  195.     i := 1; WHILE i<=len DO BEGIN
  196.       WHILE (s^[i]<=' ') AND (i<=len) DO Inc(i);
  197.       j := i + 1;
  198.       IF s^[i]='"' THEN BEGIN
  199.         Inc(i); WHILE (s^[j]<>'"') AND (j<=len) DO Inc(j);
  200.       END ELSE BEGIN
  201.         WHILE (s^[j]>' ') AND (j<=len) DO Inc(j);
  202.       END;
  203.       { Zeiger i: 1. Zeichen des Wortes, j: 1. Trennzeichen dahinter }
  204.       IF s^[i]='-' THEN BEGIN
  205.         i := i+2;
  206.         CASE s^[i-1] OF
  207.           'f': BEGIN
  208.               IF s^[i] = '=' THEN Inc(i);
  209.               IF j>i THEN  outputname := Copy(s^,i,j-i);
  210.             END;
  211.           'i': BEGIN
  212.               IF s^[i] = '=' THEN Inc(i);
  213.               IF j>i THEN  iconpath := Copy(s^,i,j-i);
  214.             END;
  215.           'e': BEGIN
  216.               IF s^[i] = '=' THEN Inc(i);
  217.               IF j>i THEN  editor := Copy(s^,i,j-i);
  218.             END;
  219.           'c': BEGIN
  220.               IF s^[i] = '=' THEN Inc(i);
  221.               IF j>i THEN  configpath := Copy(s^,i,j-i);
  222.             END;
  223.           'p': colors := Copy(s^,i,j-i);
  224.           'd': Val(copy(s^,i,j-i),busdelay,ok);
  225.           'w': Val(copy(s^,i,j-i),maxwait,ok);
  226.           'b': Val(copy(s^,i,j-i),burst,ok);
  227.           's': Val(copy(s^,i,j-i),shuffle,ok);
  228.           '?': BEGIN paraminfo; Halt(5); END;
  229.           OTHERWISE BEGIN
  230.             WriteLn('illegal parameter: ',Copy(s^,i-2,j-i+2));
  231.           END;
  232.         END;
  233.       END ELSE IF i<=len THEN BEGIN
  234.         { Was nur aus '0123456789/*' besteht, ist eine Seitennummer, alles andere eine }
  235.         { Eingabedatei. }
  236.         is_job := True;
  237.         FOR k := i TO j-1 DO
  238.           IF NOT (s^[k] IN ['0'..'9','-','/','*','.','!']) THEN is_job := False;
  239.         name := Copy(s^,i,j-i);
  240.         IF is_job THEN
  241.           add_job(name,True)
  242.         ELSE IF filetype(name)=1 THEN
  243.           gelesen := gelesen + getpages(name,True)
  244.         ELSE
  245.           WriteLn('no VT-pages found in file "',name,'"');
  246.       END;
  247.       i := j + 1;
  248.     END;
  249.   END;
  250.   IF editor<>'' THEN
  251.     IF editor[Length(editor)]<>' ' THEN editor := editor + ' ';
  252.   IF iconpath<>'' THEN
  253.     IF NOT (iconpath[Length(iconpath)] IN [':','/']) THEN
  254.       iconpath := iconpath + '/';
  255.   IF configpath<>'' THEN
  256.     IF NOT (configpath[Length(configpath)] IN [':','/']) THEN
  257.       configpath := configpath + '/';
  258.   IF colors<>'' THEN
  259.     FOR i := 0 TO 7 DO
  260.       palette[i] := hexval(Copy(colors,4*i+1,3));
  261.   IF (I2CBase<>Nil) AND (busdelay>=0) THEN
  262.     IF SetI2CDelay(busdelay)<>busdelay THEN;
  263.   homedir := CurrentDir(mypath);  { "cd PROGDIR:" :-) }
  264. END;
  265.  
  266. PROCEDURE retreat;
  267. BEGIN
  268.   IF IconBase<>Nil THEN CloseLibrary(IconBase); IconBase := Nil;
  269.   IF homedir<>0 THEN homedir := CurrentDir(homedir); homedir := 0;
  270. END;
  271.  
  272. BEGIN  { Initialisierung }
  273.   testing := False;
  274.   { ToolType-Schlüsselwörter über symbolische Konstanten zugänglich machen: }
  275.   keys := keywords('FILE','FILEMODE','ICONPATH','EDITOR','CONFIGPATH',
  276.           'PALETTE','MAXWAIT','BUSDELAY','BURST','SHUFFLE','FLAGS',
  277.           'ASCII','VT','OVERWRITE','APPEND','ICONS','NOICONS',
  278.           'NUMBERS','NONUMBERS','FIFO','LIFO','CLOCK');
  279.   homedir := 0;
  280.   IconBase := OpenLibrary('icon.library',0); AddExitServer(retreat);
  281.   { herausfinden, wie ich an mein Icon komme: }
  282.   IF FromWB THEN BEGIN
  283.     hail := StartupMessage; arg := hail^.sm_ArgList;
  284.     myname := arg^.wa_Name;
  285.     mypath := arg^.wa_Lock;
  286.   END ELSE BEGIN
  287.     pr := Ptr(FindTask(Nil)); mycli := Ptr(4*pr^.pr_CLI);
  288.     s := Ptr(4*mycli^.cli_CommandName); 
  289.     myname := Copy(s^,2,Ord(s^[1]));
  290.     mypath := pr^.pr_HomeDir;
  291.   END;
  292. END.
  293.  
  294.