Google
 

Trailing-Edge - PDP-10 Archives - decuslib10-06 - 43,50415/decom.sim
There are 4 other files named decom.sim in the archive. Click here to see a list.
OPTIONS(/L/E); !/C/-A/-I/-D);
EXTERNAL TEXT	PROCEDURE rest, scanto, frontstrip, upcase,
			front, conc, checkextension;
EXTERNAL REF (Infile)	PROCEDURE findinfile;
EXTERNAL REF (Outfile)	PROCEDURE findoutfile;
EXTERNAL BOOLEAN	PROCEDURE frontcompare;
EXTERNAL CHARACTER	PROCEDURE findtrigger;
EXTERNAL INTEGER	PROCEDURE scanint, search;
EXTERNAL LONG REAL	PROCEDURE scanreal;
EXTERNAL		PROCEDURE split;
EXTERNAL		CLASS safmin;

COMMENT  DECOM --- Interpret user command with files and switches.;

safmin CLASS decom(limit);   INTEGER limit;
BEGIN
  TEXT ARRAY swarray[1:limit];
  TEXT dottext, colontext, switchchar, equal;
  INTEGER nswin, nswout, i;

  BOOLEAN PROCEDURE deccom(command,ohead,ihead);
  NAME ohead,ihead;
  TEXT command,ohead,ihead;
  BEGIN    TEXT outspec,inspec;
    INTEGER switchcount,i,noutswitches;

    TEXT PROCEDURE getswitch(t);   NAME t;    TEXT t;
    BEGIN   TEXT s;
      split(rest(t),s,switchchar,t);
      IF s == NOTEXT THEN
      BEGIN Outtext("%DECSWV - Switch Without Value.");
	Outimage; deccom:= FALSE;
      END;
      getswitch:- s
    END of getswitch;

    INTEGER PROCEDURE collectswitch(t,header);
    NAME header;   TEXT t,header;
    BEGIN
      header:- scanto(t,'/');
      WHILE t.More DO
      BEGIN
	IF switchcount >= limit THEN
	BEGIN   Outtext("%DECTMS - Too Many Switches.");
	  deccom:= FALSE; Outimage;   GO TO exit
	END;
	switchcount:= switchcount + 1;
	swarray[switchcount]:- getswitch(t);
      END;
      exit:
      collectswitch:= switchcount
    END of collectswitch;

    deccom:= TRUE;
    OPTIONS(/A);   swarray[1]:- swarray[1];
    swarray[limit]:- swarray[limit];
    COMMENT OPTIONS(/-A);

    split(command,outspec,equal,inspec);
    noutswitches:=
    switchcount:= collectswitch(outspec,ohead);
    switchcount:= collectswitch(inspec ,ihead);
    nswin:= switchcount - noutswitches;
    nswout:= noutswitches;

  END of deccom;

  OPTIONS(/p);
  PROCEDURE createfiles(ohead,ihead,oextension,iextension,
  ofile,ifile,help);
  NAME ohead,ihead,ofile,ifile,help;
  TEXT ohead, ihead, oextension, iextension;
  REF (Outfile) ofile;   REF (Infile) ifile;
  BOOLEAN  help;
  BEGIN
    REF (Outfile) ofile2;   REF (Infile) ifile2;

    ihead:- checkextension(ihead,iextension);
    ohead:- checkextension(ohead,oextension);
    FOR ifile2:- findinfile(ihead) WHILE ifile2 == NONE DO
    BEGIN   Outtext("%DECCFI - Cannot Find Infile:");
      Outtext(ihead);    Outimage;
      request("Enter new infile spec: ",nodefault,
      textinput(ihead,TRUE),NOTEXT,help);
    END check infile;

    IF ohead = "TTY:" THEN ofile2:- Sysout ELSE
    FOR ofile2:- findoutfile(ohead) WHILE ofile2 == NONE DO
    BEGIN   Outtext("?DECIOS Illegal Outfile Spec:");
      Outtext(ohead);   Outimage;
      request("Enter new outfile spec: ",nodefault,
	  textinput(ohead,TRUE),NOTEXT,help);
    END check outfile;

    ifile:- ifile2;   ofile:- ofile2;

  END of procedure create_files;
  OPTIONS(/p);


  PROCEDURE intswitch(id,default,result,okay,errmess,help);
  NAME default, id, result, okay, errmess, help;
  TEXT default, id, errmess; INTEGER result; BOOLEAN okay, help;
  BEGIN
    TEXT sw;
    FOR i:= nswin+nswout STEP -1 UNTIL 1 DO
    IF frontcompare(swarray[i],id) THEN
    BEGIN
      sw:- swarray[i]; sw.Setpos(1); scanto(sw,':');
      swarray[i]:- NOTEXT;
      GO TO out
    END;
    IF default == NOTEXT THEN GOTO askforvalue ELSE
    sw:- Copy(default);
    out:
    result:= scanint(sw);
    IF NOT okay THEN
    BEGIN
      Outtext("?DECISV - Illegal Switch Value /"); Outtext(id);
      Outchar(':'); Outint(result,8); Outimage;
      outline(errmess);
      askforvalue: request(id,default,intinput(result,okay),errmess,help);
    END;
  END of intswitch;


  BOOLEAN PROCEDURE boolswitch(id,okay,errmess,help);
  NAME id, okay, errmess, help;
  TEXT id, errmess; BOOLEAN okay, help;
  BEGIN
    TEXT sw; BOOLEAN result;
    FOR i:= nswin+nswout STEP -1 UNTIL 1 DO
    IF frontcompare(swarray[i],id) THEN
    BEGIN
      result:= TRUE;
      swarray[i]:- NOTEXT;
      WHILE result AND NOT okay DO
      BEGIN
	Outtext("?DECISV - Illegal Switch Value: /"); Outtext(id);
	Outimage;
	outline(errmess);
	request(id,"NO",boolinput(result),errmess,help);
      END;
      out:
    END;
    out:
    boolswitch:= result;
  END of boolswitch;


  BOOLEAN PROCEDURE illegalswitch(errmess,help);
  NAME errmess, help; TEXT errmess;   BOOLEAN help;
  BEGIN
    FOR i:= nswin+nswout STEP -1 UNTIL 1 DO
    BEGIN
      IF swarray[i] =/= NOTEXT THEN
      BEGIN
	upcase(swarray[i]);   swarray[i].Setpos(1);
	IF swarray[i].Getchar = '?' OR swarray[i] = "H"
	OR swarray[i] = "HE" OR
	swarray[i] = "HEL" OR swarray[i] = "HELP" THEN
	BEGIN   IF help THEN ; END ELSE
	BEGIN
	  Outtext(errmess); Outtext(swarray[i]);
	  Outimage;
	END;
	illegalswitch:= TRUE;
      END;
    END;
  END;

  dottext:- Copy(".:/=");
  equal:- dottext.Sub(4,1);
  switchchar:- dottext.Sub(3,1);
  colontext:- dottext.Sub(2,1);
  dottext:- dottext.Sub(1,1);

END of decom;