home *** CD-ROM | disk | FTP | other *** search
/ The Best of Mecomp Multimedia 1 / Mecomp-CD.iso / amiga / tools / misc / videotext5.41 / src / startup.p < prev    next >
Encoding:
Text File  |  1997-05-04  |  12.6 KB  |  367 lines

  1. UNIT startup; {$project vt }
  2. { Wertet die Programmstartargumente für VideoText aus }
  3. { ToolTypes:                  CLI-Parameter:  }
  4. { HOMEDIR=<pathname>          -h=<pathname> }
  5. { FILE=<output name>          -f=<output name> }
  6. { FILEMODE=<flag>|<flag>|...                   }
  7. { EDITOR=<dos command>        -e=<dos command> }
  8. { SCREENMODE=<mode id>        -m<mode id> }
  9. { PALETTE=<rgb>,<rgb>,...     -p<rgb>,<rgb>,... }
  10. { COLPERM=<digits>            -r<colperm digits> }
  11. { MAXWAIT=<seconds>           -w<seconds> }
  12. { BUSDELAY=<counter>          -d<counter> }
  13. { BURST=<tics>                -b<tics> }
  14. { SHUFFLE=<tics>              -s<tics> }
  15. { SPEECH=<text>               -c=<text> }
  16. { AUTOTIMER=<seconds>         -t<seconds> }
  17. { DATESTYLE=[0|1|2|3]         -y<style> }
  18. { TVMODE=[0|1|2]                       }
  19. { FLAGS=<flag>|<flag>|...              }
  20. {                             <page> <page> ... }
  21. {                             <file> <file> ... }
  22.  
  23. INTERFACE; FROM vt USES jobs;
  24.  
  25. VAR testing: Word;
  26.     speech: str80;
  27.     autotimer: Integer;
  28.  
  29. FUNCTION write_to_icon: Boolean;
  30. PROCEDURE get_args;
  31.  
  32. { ---------------------------------------------------------------------- }
  33.  
  34. IMPLEMENTATION;
  35.  
  36. {$opt q,s+,i+ } { keine Laufzeitprüfungen außer Stack und Feldindizes }
  37. {$incl "workbench/startup.h", "icon.lib", "dos.lib", "asl.lib" }
  38. {$incl "exec.lib", "dos/dosextens.h" }
  39.  
  40. TYPE keyid=(hmd,fil,flm,edi,scm,pal,cpr,mxw,bdl,bst,shu,spk,aut,dts,tvm,flg,
  41.             asc,vtx,ics,nic,fif,lif,stn,clk,wrx,big);
  42.      keywords=ARRAY[keyid] OF Str;  { s. Inititalisierungsteil }
  43.  
  44. VAR mypath,homedir,returndir: BPTR;
  45.     myname,colors: str80;
  46.     homedirname: String[160];
  47.     busdelay: Integer;
  48.     hail: p_WBStartup;
  49.     arg: p_WBArg;
  50.     s: ^String[1000];
  51.     keys,ttarry: keywords;
  52.     strstack: String[1000]; STATIC;   { fürs Zurückschreiben der ToolTypes }
  53.     stacked: Integer;
  54.     
  55. PROCEDURE read_from_icon;
  56. { Startparameter lesen }
  57. VAR icon: p_DiskObject;
  58.     entry: Str;
  59.     olddir: BPTR;
  60.     i,ok: Integer;
  61.     key,key2: keyid;
  62. BEGIN
  63.   IF IconBase=Nil THEN Exit;
  64.   olddir := CurrentDir(mypath);
  65.   icon := GetDiskObject(myname);
  66.   IF icon<>Nil THEN BEGIN
  67.     FOR key := hmd TO flg DO BEGIN
  68.       entry := FindToolType(icon^.do_ToolTypes, keys[key]);
  69.       IF Ptr(entry)<>Nil THEN CASE key OF
  70.         hmd: homedirname := entry;
  71.         fil: outputname := entry;
  72.         flm: FOR key2 := asc TO nic DO
  73.           IF MatchToolValue(entry,keys[key2]) THEN CASE key2 OF
  74.             asc: asciifile := True;
  75.             vtx: asciifile := False;
  76.             ics: withicon := True;
  77.             nic: withicon := False;
  78.             OTHERWISE;
  79.           END;
  80.         edi: editor := entry;
  81.         scm: screenmode := hexval(Copy(entry,1,10));
  82.         pal: colors := entry;
  83.         cpr: colperm := hexval(Copy(entry,1,10));
  84.         mxw: Val(entry,maxwait,ok);
  85.         bdl: Val(entry,busdelay,ok);
  86.         bst: Val(entry,burst,ok);
  87.         shu: Val(entry,shuffle,ok);
  88.         aut: Val(entry,autotimer,ok);
  89.         dts: BEGIN Val(entry,i,ok); datestyle := i; END;
  90.         tvm: Val(entry,tv_status,ok);
  91.         spk: speech := entry;
  92.         flg: FOR key2 := fif TO big DO
  93.           IF MatchToolValue(entry,keys[key2]) THEN CASE key2 OF
  94.             fif: fifo := True;
  95.             lif: fifo := False;
  96.             clk: testing := testing OR 1;
  97.             stn: testing := testing OR 2;
  98.             wrx: silentrexx := True;
  99.             big: fontno := 2;   
  100.             OTHERWISE;
  101.           END;
  102.         OTHERWISE;
  103.       END;
  104.     END;
  105.     FreeDiskObject(icon);
  106.   END;
  107.   olddir := CurrentDir(olddir);
  108. END;
  109.  
  110. FUNCTION add_tooltype(s: Str): Str;
  111. { einen String in den globalen Stringpuffer kopieren }
  112. VAR i: Integer;
  113.     s2: ^String[200];
  114. BEGIN
  115.   add_tooltype := ^strstack[stacked]; s2 := s; i := 0;
  116.   REPEAT
  117.     Inc(i); strstack[stacked] := s2^[i]; Inc(stacked); 
  118.   UNTIL s2^[i]=chr(0);
  119. END;
  120.  
  121. FUNCTION write_to_icon{: Boolean};
  122. { aktuelle Parameter ins Icon zurückschreiben }
  123. VAR icon: p_DiskObject;
  124.     olddir: BPTR;
  125.     s1: String[200];
  126.     j: Integer;
  127.     key: keyid;
  128. BEGIN
  129.   write_to_icon := False;
  130.   IF IconBase=Nil THEN Exit;
  131.   olddir := CurrentDir(mypath);
  132.   icon := GetDiskObject(myname);
  133.   IF icon<>Nil THEN BEGIN
  134.     FOR key := hmd TO big DO ttarry[key] := Nil; stacked := 1;
  135.     icon^.do_ToolTypes := ^ttarry;
  136.     { Informationen auf neuesten Stand bringen: }
  137.     getpalette; colors := ''; FOR j := 0 TO 7 DO 
  138.       colors := colors + hexstr(palette[j],3)+','; 
  139.     colors[Length(colors)] := #0; { letztes "," löschen }
  140.     IF I2CBase<>Nil THEN
  141.       busdelay := SetI2CDelay(I2CDELAY_READONLY);
  142.     { Ausgabetexte erzeugen: }
  143.     FOR key := hmd TO flg DO BEGIN
  144.       s1 := keys[key]+'=';
  145.       CASE key OF
  146.         hmd: s1 := s1 + homedirname;
  147.         fil: s1 := s1 + outputname;
  148.         flm: BEGIN
  149.             IF asciifile THEN s1 := s1 + keys[asc] + '|'
  150.               ELSE s1 := s1 + keys[vtx] + '|';
  151.             IF withicon THEN s1 := s1 + keys[ics]
  152.               ELSE s1 := s1 + keys[nic];
  153.           END;
  154.         edi: s1 := s1 + editor;
  155.         scm: s1 := s1 + '$' + hexstr(screenmode,8);
  156.         pal: s1 := s1 + colors;
  157.         cpr: s1 := s1 + hexstr(colperm,8);
  158.         mxw: s1 := s1 + IntStr(maxwait);
  159.         bdl: s1 := s1 + IntStr(busdelay);
  160.         bst: s1 := s1 + IntStr(burst);
  161.         shu: s1 := s1 + IntStr(shuffle);
  162.         aut: s1 := s1 + IntStr(autotimer);
  163.         dts: s1 := s1 + IntStr(datestyle);
  164.         tvm: s1 := s1 + IntStr(tv_status);
  165.         spk: s1 := s1 + speech;
  166.         flg: BEGIN
  167.             IF fifo THEN s1 := s1 + keys[fif]
  168.               ELSE s1 := s1 + keys[lif];
  169.             IF (testing AND 1)<>0 THEN s1 := s1 + '|' + keys[clk];
  170.             IF (testing AND 2)<>0 THEN s1 := s1 + '|' + keys[stn];
  171.             IF silentrexx THEN s1 := s1 + '|' + keys[wrx];
  172.             IF fontno=2 THEN s1 := s1 + '|' + keys[big];
  173.           END;                                     
  174.         OTHERWISE;
  175.       END;
  176.       ttarry[key] := add_tooltype(s1);
  177.     END;
  178.     write_to_icon := PutDiskObject(myname,icon);
  179.     FreeDiskObject(icon);
  180.   END;
  181.   olddir := CurrentDir(olddir);
  182. END;
  183.  
  184. PROCEDURE paraminfo;
  185. { kurze Info für CLI-Benutzer }
  186. BEGIN
  187.   WriteLn('legal parameters:');
  188.   WriteLn(myname,' <page> <page> ... <file> <file> ...');
  189.   WriteLn('  -h=<homedir> -f=<outputfile> -e=<editcommand> -c=<speechtext>');
  190.   WriteLn('  -m<screenmode> -p<rgb>,<rgb>,... -r<colperm digits> -y<datestyle>');
  191.   Write('  -t<secs/slide> -d<busdelay> -w<seconds> -b<ticks> -s<ticks>');
  192.   { Irgendwer erzeugt mir nach Halt() noch zwei extra LF's ... }
  193. END;
  194.  
  195. PROCEDURE get_args;
  196. { wertet CLI- oder WorkBench-Argumente aus }
  197. VAR len,i,j,k,ok,gelesen: Integer;
  198.     name: str80;
  199.     is_job: Boolean;
  200.     scrmd_bak: Long;
  201.     olddir: BPTR;
  202.     entry: Str;
  203.     icon: p_DiskObject;
  204.     smreq: p_ScreenModeRequester;
  205.     tags: ARRAY[1..5] OF TagItem;
  206. BEGIN
  207.   gelesen := 0;
  208.   busdelay := -1;
  209.   scrmd_bak := screenmode; screenmode := -1;
  210.   colors := '';
  211.   read_from_icon;
  212.   IF fromWB THEN BEGIN    { *** Workbench-Start }
  213.     hail := StartupMessage;
  214.     arg := hail^.sm_ArgList;
  215.     FOR i := 1 to hail^.sm_NumArgs DO BEGIN
  216.       IF i>1 THEN BEGIN  { zusätzliche Dateien: enthaltene Seiten einlesen }
  217.         olddir := CurrentDir(arg^.wa_Lock);
  218.         name := arg^.wa_Name;
  219.         IF filetype(name)=1 THEN
  220.           gelesen := gelesen + getpages(name,True);
  221.         icon := GetDiskObject(arg^.wa_Name);
  222.         { und die ToolTypes SCREENMODE, COLPERM und AUTOTIMER abfragen: }
  223.         IF icon<>Nil THEN BEGIN
  224.           entry := FindToolType(icon^.do_ToolTypes, keys[scm]);
  225.           IF ptr(entry)<>Nil THEN
  226.             screenmode := hexval(Copy(entry,1,10));
  227.           entry := FindToolType(icon^.do_ToolTypes, keys[cpr]);
  228.           IF ptr(entry)<>Nil THEN
  229.             colperm := hexval(Copy(entry,1,10));
  230.           entry := FindToolType(icon^.do_ToolTypes, keys[aut]);
  231.           IF ptr(entry)<>Nil THEN
  232.             Val(entry,autotimer,ok);
  233.          FreeDiskObject(icon);
  234.         END;
  235.       END;
  236.       { auf nächsten WBArg-Zeiger zugreifen: }
  237.       arg := Ptr(Long(arg)+SizeOf(WBArg));
  238.     END;
  239.   END ELSE IF ParameterLen>0 THEN BEGIN    { *** CLI-Start }
  240.     s := ParameterStr; len := ParameterLen;
  241.     { Parameterzeile in Worte zerlegen, wie der argv[] in C es schon ist :-( }
  242.     i := 1; WHILE i<=len DO BEGIN
  243.       WHILE (s^[i]<=' ') AND (i<=len) DO Inc(i);
  244.       j := i + 1;
  245.       IF s^[i]='"' THEN BEGIN
  246.         Inc(i); WHILE (s^[j]<>'"') AND (j<=len) DO Inc(j);
  247.       END ELSE BEGIN
  248.         WHILE (s^[j]>' ') AND (j<=len) DO Inc(j);
  249.       END;
  250.       { Zeiger i: 1. Zeichen des Wortes, j: 1. Trennzeichen dahinter }
  251.       IF s^[i]='-' THEN BEGIN
  252.         i := i+2;
  253.         CASE s^[i-1] OF
  254.           'h': BEGIN
  255.               IF s^[i] = '=' THEN Inc(i);
  256.               IF j>i THEN  homedirname := Copy(s^,i,j-i) ELSE homedirname := '';
  257.             END;
  258.           'f': BEGIN
  259.               IF s^[i] = '=' THEN Inc(i);
  260.               IF j>i THEN  outputname := Copy(s^,i,j-i);
  261.             END;
  262.           'e': BEGIN
  263.               IF s^[i] = '=' THEN Inc(i);
  264.               IF j>i THEN  editor := Copy(s^,i,j-i);
  265.             END;
  266.           'c': BEGIN
  267.               IF s^[i] = '=' THEN Inc(i);
  268.               IF j>i THEN  speech := Copy(s^,i,j-i) ELSE speech := '';
  269.             END;
  270.           'm': screenmode := hexval(Copy(s^,i,j-i));
  271.           'p': colors := Copy(s^,i,j-i);
  272.           'r': colperm := hexval(Copy(s^,i,j-i));
  273.           'd': Val(Copy(s^,i,j-i),busdelay,ok);
  274.           'w': Val(Copy(s^,i,j-i),maxwait,ok);
  275.           'b': Val(Copy(s^,i,j-i),burst,ok);
  276.           's': Val(Copy(s^,i,j-i),shuffle,ok);
  277.           't': Val(Copy(s^,i,j-i),autotimer,ok);
  278.           'y': BEGIN Val(Copy(s^,i,j-i),i,ok); datestyle := i; END;
  279.           '?': BEGIN paraminfo; Halt(5); END;
  280.           OTHERWISE BEGIN
  281.             WriteLn('illegal parameter: ',Copy(s^,i-2,j-i+2));
  282.           END;
  283.         END;
  284.       END ELSE IF i<=len THEN BEGIN
  285.         { Was nur aus '0123456789/*' besteht, ist eine Seitennummer, alles andere eine }
  286.         { Eingabedatei. }
  287.         is_job := True;
  288.         FOR k := i TO j-1 DO
  289.           IF NOT (s^[k] IN ['0'..'9','-','/','*','.','!']) THEN is_job := False;
  290.         name := Copy(s^,i,j-i);
  291.         IF is_job THEN
  292.           add_job(name,True)
  293.         ELSE IF filetype(name)=1 THEN
  294.           gelesen := gelesen + getpages(name,True)
  295.         ELSE
  296.           WriteLn('no VT-pages found in file "',name,'"');
  297.       END;
  298.       i := j + 1;
  299.     END;
  300.   END;
  301.   IF editor<>'' THEN
  302.     IF editor[Length(editor)]<>' ' THEN editor := editor + ' ';
  303.   IF screenmode=-1 THEN BEGIN
  304.     screenmode := scrmd_bak;  { HIRES, wie von Unit sys voreingestellt }
  305.     IF AslBase<>Nil THEN BEGIN
  306.       tags[1] := TagItem(ASLSM_TitleText, 0);
  307.       tags[1].ti_Data := "VideoText-Screen wählen";
  308.       tags[2] := TagItem(ASLSM_MinDepth, 3);
  309.       tags[3] := TagItem(ASLSM_InitialDisplayID, screenmode);
  310.       tags[4] := TagItem(TAG_DONE, 0);
  311.       smreq := AllocAslRequest(ASL_ScreenModeRequester,^tags[1]);
  312.       IF smreq<>Nil THEN BEGIN
  313.         IF AslRequest(smreq, Nil) THEN
  314.           screenmode := smreq^.sm_DisplayID;
  315.         FreeAslRequest(smreq);
  316.       END;
  317.     END;
  318.   END;
  319.   IF colors<>'' THEN
  320.     FOR i := 0 TO 7 DO
  321.       palette[i] := hexval(Copy(colors,4*i+1,3));
  322.   make_colperms(colperm);
  323.   IF (I2CBase<>Nil) AND (busdelay>=0) THEN
  324.     IF SetI2CDelay(busdelay)<>busdelay THEN;
  325.   IF homedirname='' THEN 
  326.     returndir := CurrentDir(mypath)  { "cd PROGDIR:" }
  327.   ELSE BEGIN
  328.     homedir := Lock(homedirname, ACCESS_READ);
  329.     IF homedir<>0 THEN
  330.       returndir := CurrentDir(homedir)
  331.     ELSE
  332.       returndir := CurrentDir(mypath);  { notfalls "cd PROGDIR:" }
  333.   END;
  334. END;
  335.  
  336. PROCEDURE retreat;
  337. VAR egal: Long;
  338. BEGIN
  339.   IF IconBase<>Nil THEN CloseLibrary(IconBase); IconBase := Nil;
  340.   IF AslBase<>Nil THEN CloseLibrary(AslBase); AslBase := Nil;
  341.   IF returndir<>0 THEN egal := CurrentDir(returndir); returndir := 0;
  342.   IF homedir<>0 THEN UnLock(homedir); homedir := 0;
  343. END;
  344.  
  345. BEGIN  { Initialisierung }
  346.   testing := 0; autotimer := 2; speech := ''; homedirname := '';
  347.   { ToolType-Schlüsselwörter über symbolische Konstanten zugänglich machen: }
  348.   keys := keywords('HOMEDIR','FILE','FILEMODE','EDITOR',
  349.           'SCREENMODE','PALETTE','COLPERM','MAXWAIT','BUSDELAY','BURST',
  350.           'SHUFFLE','SPEECH','AUTOTIMER','DATESTYLE','TVMODE','FLAGS',
  351.           'ASCII','VT', 'ICONS','NOICONS',
  352.           'FIFO','LIFO','STATION','CLOCK','WBREXX','BIGFONT');
  353.   homedir := 0; returndir := 0;
  354.   AslBase := OpenLibrary(ASLNAME,38); { brauche den ScreenMode-Requester! }
  355.   IconBase := OpenLibrary('icon.library',0); AddExitServer(retreat);
  356.   { herausfinden, wie ich an mein Icon komme: }
  357.   IF FromWB THEN BEGIN
  358.     hail := StartupMessage; arg := hail^.sm_ArgList;
  359.     mypath := arg^.wa_Lock;
  360.     myname := arg^.wa_Name;
  361.   END ELSE BEGIN
  362.     mypath := GetProgramDir;
  363.     IF NOT GetProgramName(^myname,80) THEN ;
  364.   END;
  365. END.
  366.  
  367.