UNIT startup; {$project vt }
{ Wertet die Programmstartargumente für VideoText aus }

INTERFACE; FROM vt USES jobs;

PROCEDURE get_args;

{ ---------------------------------------------------------------------- }

IMPLEMENTATION;

{$opt q,s+,i+ } { keine Laufzeitprüfungen außer Stack und Feldindizes }
{$incl "workbench/startup.h", "icon.lib", "dos.lib" }

PROCEDURE get_args;
{ wertet CLI- oder WorkBench-Argumente aus }
{ ToolTypes:                  CLI-Parameter:  }
{ PALETTE=<rgb>,<rgb>,...     -p<rgb>,<rgb>,... }
{ FILE=<output name>          -f=<output name> }
{ ICONPATH=<pathname>         -i=<pathname> }
{ EDITOR=<dos command>        -e=<dos command> }
{ CONFIGPATH=<pathname>       -c=<pathname> }
{ MAXWAIT=<seconds>           -w<seconds> }
{ BUSDELAY=<counter>          -d<counter> }
{ BURST=<tics>                -b<tics> }
{ SHUFFLE=<tics>              -s<tics> }
{                             <page> <page> ... }
{                             <file> <file> ... }
VAR s: ^String[1000];
    len,i,j,k,ok,gelesen: Integer;
    name,colors: str80;
    is_job: Boolean;
    hail: p_WBStartup;
    arg: p_WBArg;
    olddir: BPTR;
    icon: p_DiskObject;
    entry: Str;
FUNCTION is_space(ch: Char): Boolean;
  BEGIN  is_space := (ch=' ') OR (ch=#9) OR (ch=#10) OR (ch=#13);  END;
BEGIN
  gelesen := 0;
  colors := '';
  IF fromWB THEN BEGIN    { *** WorkBench-Start }
    OpenLib(IconBase,'icon.library',0);
    hail := StartupMessage;
    arg := hail^.sm_ArgList;
    FOR i := 1 to hail^.sm_NumArgs DO BEGIN
      olddir := CurrentDir(arg^.wa_Lock);
      name := arg^.wa_Name;
      IF i=1 THEN BEGIN  { 1. Datei: das Programm selbst, ToolTypes checken }
        icon := GetDiskObject(name);
        IF icon<>Nil THEN BEGIN
          entry := FindToolType(icon^.do_ToolTypes, 'PALETTE');
          IF Ptr(entry)<>Nil THEN
            colors := entry;
          entry := FindToolType(icon^.do_ToolTypes, 'FILE');
          IF Ptr(entry)<>Nil THEN
            outputname := entry;
          entry := FindToolType(icon^.do_ToolTypes, 'ICONPATH');
          IF Ptr(entry)<>Nil THEN
            iconpath := entry;
          entry := FindToolType(icon^.do_ToolTypes, 'EDITOR');
          IF Ptr(entry)<>Nil THEN
            editor := entry;
          entry := FindToolType(icon^.do_ToolTypes, 'CONFIGPATH');
          IF Ptr(entry)<>Nil THEN
            configpath := entry;
          entry := FindToolType(icon^.do_ToolTypes, 'MAXWAIT');
          IF Ptr(entry)<>Nil THEN
            Val(entry,maxwait,ok);
          entry := FindToolType(icon^.do_ToolTypes, 'BUSDELAY');
          IF Ptr(entry)<>Nil THEN
            Val(entry,busdelay,ok);
          entry := FindToolType(icon^.do_ToolTypes, 'BURST');
          IF Ptr(entry)<>Nil THEN
            Val(entry,burst,ok);
          entry := FindToolType(icon^.do_ToolTypes, 'SHUFFLE');
          IF Ptr(entry)<>Nil THEN
            Val(entry,shuffle,ok);
          FreeDiskObject(icon);
        END;
      END ELSE BEGIN  { zusätzliche Dateien: enthalten Seiten, einlesen }
        IF filetype(name)=1 THEN
          gelesen := gelesen + getpages(name);
        olddir := CurrentDir(olddir);
      END;
      { auf nächsten WBArg-Zeiger zugreifen: }
      arg := Ptr(Long(arg)+SizeOf(WBArg));
    END;
    CloseLib(IconBase);
  END ELSE IF ParameterLen>0 THEN BEGIN    { *** CLI-Start }
    s := ParameterStr;
    len := ParameterLen;
    { Parameterzeile in Worte zerlegen, wie der argv[] in C es schon ist :-( }
    i := 1; WHILE i<=len DO BEGIN
      WHILE is_space(s^[i]) AND (i<len) DO Inc(i);
      j := i + 1;
      IF s^[i]='"' THEN BEGIN
        Inc(i); while (s^[j]<>'"') AND (j<=len) do Inc(j);
      END ELSE BEGIN
        while NOT is_space(s^[j]) AND (j<=len) do Inc(j);
      END;
      { Zeiger i: 1. Zeichen des Wortes, j: 1. Trennzeichen dahinter }
      IF s^[i]='-' THEN BEGIN
        i := i+2;
        CASE s^[i-1] OF
          'f': BEGIN
              IF s^[i] = '=' THEN Inc(i);
              IF j>i THEN  outputname := Copy(s^,i,j-i);
            END;
          'i': BEGIN
              IF s^[i] = '=' THEN Inc(i);
              IF j>i THEN  iconpath := Copy(s^,i,j-i);
            END;
          'e': BEGIN
              IF s^[i] = '=' THEN Inc(i);
              IF j>i THEN  editor := Copy(s^,i,j-i);
            END;
          'c': BEGIN
              IF s^[i] = '=' THEN Inc(i);
              IF j>i THEN  configpath := Copy(s^,i,j-i);
            END;
          'p': colors := Copy(s^,i,j-i);
          'd': Val(copy(s^,i,j-i),busdelay,ok);
          'w': Val(copy(s^,i,j-i),maxwait,ok);
          'b': Val(copy(s^,i,j-i),burst,ok);
          's': Val(copy(s^,i,j-i),shuffle,ok);
          OTHERWISE BEGIN
            WriteLn('illegal parameter: ',Copy(s^,i,j-i));
          END;
        END;
      END ELSE BEGIN
        { Was nur aus '0123456789/*' besteht, ist eine Seitennummer, alles andere eine }
        { Eingabedatei. }
        is_job := True;
        FOR k := i TO j-1 DO
          IF NOT (s^[k] IN ['0'..'9','/','*','.','!']) THEN is_job := False;
        name := Copy(s^,i,j-i);
        IF is_job THEN
          add_job(name,True)
        ELSE IF filetype(name)=1 THEN
          gelesen := gelesen + getpages(name)
        ELSE
          WriteLn('no VT-pages found in file "',name,'"');
      END;
      i := j + 1;
    END;
  END;
  IF (queued=0) AND (gelesen=0) THEN
    add_job('100/*',True);
  IF editor<>'' THEN
    IF editor[Length(editor)]<>' ' THEN editor := editor + ' ';
  IF iconpath<>'' THEN
    IF NOT (iconpath[Length(iconpath)] IN [':','/']) THEN
      iconpath := iconpath + '/';
  IF configpath<>'' THEN
    IF NOT (configpath[Length(configpath)] IN [':','/']) THEN
      configpath := configpath + '/';
  IF colors<>'' THEN
    FOR i := 0 TO 7 DO
      palette[i] := hexval(Copy(colors,4*i+1,3));
END;

BEGIN  { Initialisierung }
END.
