home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol062 / docomm.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1984-04-29  |  4.1 KB  |  149 lines

  1. EXTERNAL KFORMAT::DOCOMM;
  2.  
  3. {++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  4. {+  DO COMMAND MODULE for KFORMAT Text Output Processor.  +}
  5. {++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  6.  
  7. { Compiler options for the Pascal/Z compiler. }
  8. {$C-}{ control-c checking OFF }
  9. {$M-}{ integer mult & divd error checking OFF }
  10. {$F-}{ floating point error checking OFF }
  11.  
  12.  
  13. PROCEDURE DOCOMMAND(cmdline:BUFFER);
  14. VAR    argval: int;          { holds value of argument of command }
  15.     argtype: char;          { holds argument type flag }
  16.  
  17.   {
  18.     decode command type
  19.   }
  20.   FUNCTION comtype(cmdline:BUFFER):CMDSET;
  21.   { modified for linear search with sentinal 3-18-81/rep }
  22.   VAR    ct    :CMDSET;
  23.     searchkey :CMDVAL;
  24.   BEGIN
  25.     searchkey[1] := cmdline[2];
  26.     searchkey[2] := cmdline[3];
  27.     cmdlist[UNKN] := searchkey; { * insert sentinal * }
  28.     ct := CMD0;
  29.     repeat ct := succ(ct)
  30.     until ( cmdlist[ct]=searchkey );
  31.     { returns either match or UNKN for no match }
  32.     comtype := ct;
  33.   END;
  34.  
  35.   {
  36.     Get a parameter value from a command line and
  37.     whether it is an absolute or relative value.
  38.   }
  39.   FUNCTION GETVAL(VAR cmdline:BUFFER; VAR argtyp:CHAR):int;
  40.   VAR    i   :int;
  41.   BEGIN
  42.     i := 1;
  43.     SKIPCHARS(cmdline,i);
  44.     SKIPBL(cmdline,i);
  45.     argtyp := cmdline[i];        { * argument type: +,- or digit * }
  46.     IF (argtyp=PLUS) OR (argtyp=MINUS) THEN i := i + 1;
  47.     GETVAL := CTOI(cmdline,i)        { *** 3-81 *** }
  48.   END;
  49.  
  50.   {
  51.      Copy title from buffer cmdline to title buffer.
  52.   }
  53.   PROCEDURE GETTL(cmdline:BUFFER; VAR thettl:BUFFER);
  54.   VAR    i :int;
  55.   BEGIN
  56.     i := 1;            { * skip command name * }
  57.     SKIPCHARS(cmdline,i);
  58.     SKIPBL(cmdline,i);        { * find argument * }
  59.     IF (cmdline[i]=SQUOTE) OR (cmdline[i]=DQUOTE) THEN i := i + 1;
  60.     thettl := COPY(cmdline,i,LENGTH(cmdline)-i+1);
  61.   END;
  62.  
  63.   {
  64.      Set is a general routine for updating a parameter, relatively
  65.      or absolutely or to a default value.
  66.   }
  67.   PROCEDURE SETVAL(VAR param: int; newval: int; argtype: CHAR;
  68.                    defval,minval,maxval: int );
  69.   BEGIN
  70.     case ORD(argtype) of
  71.      0: {NEWLINE} param := defval;        { defaulted  }
  72.     43: {PLUS}   param := param + newval;    { relative + }
  73.     45: {MINUS}  param := param - newval;    { relative - }
  74.       ELSE:   param := newval            { absolute   }
  75.     end;
  76.     param := IMIN(param,maxval);
  77.     param := IMAX(minval,param);
  78.   END;
  79.  
  80.   {
  81.     space n lines or to bottom of page
  82.   }
  83.   PROCEDURE DOSPACE(n:int);
  84.   BEGIN
  85.     DOBREAK;
  86.     IF (lineno <= bottom) THEN
  87.       begin  IF (lineno=0) THEN PUTHEAD;
  88.          SKIP(IMIN(n,bottom+1-lineno));
  89.          lineno := lineno + n;
  90.          IF (lineno > bottom) THEN PUTFOOT;
  91.       end;
  92.   END;
  93.  
  94. BEGIN {docommand}
  95.   argval := GETVAL(cmdline,argtype);
  96.   case comtype(cmdline) of
  97.     UNKN   :  { * ignore unknown commands * };
  98.     fi       :  BEGIN            {+ FILL - fills lines/ragged right +}
  99.         DOBREAK;
  100.         fill := TRUE;
  101.           END;
  102.     ce       :  BEGIN
  103.         DOBREAK;
  104.         SETVAL(ceval,argval,argtype,1,0,HUGE);
  105.           END;
  106.     ul       :    SETVAL(ulval,argval,argtype,1,0,HUGE);    { *** 3-81 *** }
  107.     ls       :    SETVAL(lsval,argval,argtype,1,1,HUGE);
  108.     bp       :  BEGIN
  109.         IF (lineno > 0) THEN DOSPACE(HUGE);
  110.         SETVAL(curpag,argval,argtype,curpag+1,-HUGE,HUGE);
  111.         newpag := curpag;
  112.           END;
  113.     he       :  GETTL(cmdline,header);
  114.     fo       :  GETTL(cmdline,footer);
  115.     ind    :  BEGIN
  116.         SETVAL(inval,argval,argtype,0,0,rmval-1);
  117.         tival := inval;
  118.           END;
  119.     rm       :  SETVAL(rmval,argval,argtype,PAGWIDDEF,tival+1,HUGE);
  120.     ti       :  BEGIN
  121.         DOBREAK;
  122.         SETVAL(tival,argval,argtype,0,0,rmval);
  123.           END;
  124.     nf       :  BEGIN        {+ NO FILL - justify and fill OFF +}
  125.         DOBREAK;
  126.         fill := FALSE;
  127.         spacefill := FALSE;
  128.           END;
  129.     sf       :  BEGIN        {+ SPACE FILL - justify ON +}
  130.         DOBREAK;
  131.         fill := TRUE;
  132.         spacefill := TRUE;
  133.           END;
  134.     sp       :  BEGIN
  135.         SETVAL(spval,argval,argtype,1,0,HUGE);
  136.         DOSPACE(spval);
  137.           END;
  138.     pl       :  BEGIN
  139.         SETVAL(plval,argval,argtype,
  140.             PAGLENDEF,(m1val+m2val+m3val+m4val+1),HUGE);
  141.         bottom := plval-m3val-m4val;
  142.           END;
  143.     br       :  DOBREAK;
  144.   END {case};
  145. END;  {docommand}
  146.  
  147. {END EXTERNAL}.
  148.  
  149.