home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / unix / volume3 / turbo_tools / part1 / toolu.pas < prev   
Encoding:
Pascal/Delphi Source File  |  1986-11-30  |  11.9 KB  |  683 lines

  1. {toolu.pas}
  2.  
  3. {
  4.         Copyright (c) 1981
  5.         By:     Bell Telephone Laboratories, Inc. and
  6.                 Whitesmith's Ltd.,
  7.  
  8.         This software is derived from the book
  9.                 "Software Tools in Pascal", by
  10.                 Brian W. Kernighan and P. J. Plauger
  11.                 Addison-Wesley, 1981
  12.                 ISBN 0-201-10342-7
  13.  
  14.         Right is hereby granted to freely distribute or duplicate this
  15.         software, providing distribution or duplication is not for profit
  16.         or other commercial gain and that this copyright notice remains
  17.         intact.
  18. }
  19.  
  20. CONST
  21.   IOERROR=0;
  22.   STDIN=1;
  23.   STDOUT=2;
  24.   STDERR=3;
  25. (*IO RELEATED STUFF*)
  26.   MAXOPEN=7;
  27.   IOREAD=0;
  28.   IOWRITE=1;
  29.   MAXCMD=20;
  30.   ENDFILE=255;
  31.   BLANK=32;
  32.   ENDSTR=0;
  33.   MAXSTR=100;
  34.   BACKSPACE=8;
  35.   TAB=9;
  36.   NEWLINE=10;
  37.   EXCLAM=33;
  38.   DQUOTE=34;
  39.   SHARP=35;
  40.   DOLLAR=36;
  41.   PERCENT=37;
  42.   AMPER=38;
  43.   SQUOTE=39;
  44.   ACUTE=SQUOTE;
  45.   LPAREN=40;
  46.   RPAREN=41;
  47.   STAR=42;
  48.   PLUS=43;
  49.   COMMA=44;
  50.   MINUS=45;
  51.   DASH=MINUS;
  52.   PERIOD=46;
  53.   SLASH=47;
  54.   COLON=58;
  55.   SEMICOL=59;
  56.   LESS=60;
  57.   EQUALS=61;
  58.   GREATER=62;
  59.   QUESTION=63;
  60.   ATSIGN=64;
  61.   ESCAPE=ATSIGN;
  62.   LBRACK=91;
  63.   BACKSLASH=92;
  64.   RBRACK=93;
  65.   CARET=94;
  66.   GRAVE=96;
  67.   UNDERLINE=95;
  68.   TILDE=126;
  69.   LBRACE=123;
  70.   BAR=124;
  71.   RBRACE=125;
  72.   
  73. TYPE
  74.    CHARACTER=0..255;
  75.    XSTRING=ARRAY[1..MAXSTR]OF CHARACTER;
  76.   STRING80=string[80];
  77.   FILEDESC=IOERROR..MAXOPEN;
  78.   FILTYP=(CLOSED,STDIO,FIL1,FIL2,FIL3,FIL4);
  79.  
  80. VAR
  81.    KBDN,KBDNEXT:INTEGER;
  82.    KBDLINE:XSTRING;
  83.    CMDARGS:0..MAXCMD;
  84.    CMDIDX:ARRAY[1..MAXCMD] OF 1..MAXSTR;
  85.    CMDLIN:XSTRING;
  86.    CMDLINE:STRING80;
  87.    CMDFIL:ARRAY[STDIN..MAXOPEN]OF FILTYP;
  88.    CMDOPEN:ARRAY[FILTYP]OF BOOLEAN;
  89.    FILE1,FILE2,FILE3,FILE4:TEXT;
  90.    
  91.  
  92.  
  93. FUNCTION GETKBD(VAR C:CHARACTER):CHARACTER;FORWARD;
  94. FUNCTION FGETCF(VAR FIL:TEXT):CHARACTER;FORWARD;
  95. FUNCTION GETCF(VAR C:CHARACTER;FD:FILEDESC):CHARACTER;FORWARD;
  96. FUNCTION GETC(VAR C:CHARACTER):CHARACTER;FORWARD;
  97. PROCEDURE FPUTCF(C:CHARACTER;VAR FIL:TEXT);FORWARD;
  98. PROCEDURE PUTCF(C:CHARACTER;FD:FILEDESC);FORWARD;
  99. PROCEDURE PUTC(C:CHARACTER);FORWARD;
  100. PROCEDURE PUTDEC(N,W:INTEGER);FORWARD;
  101. FUNCTION ITOC(N:INTEGER;VAR S:XSTRING;I:INTEGER):INTEGER;FORWARD;
  102. FUNCTION GETARG(N:INTEGER;VAR S:XSTRING;
  103.   MAXSIZE:INTEGER):BOOLEAN;FORWARD;
  104.   PROCEDURE SCOPY(VAR SRC:XSTRING;I:INTEGER;VAR DEST:XSTRING;J:INTEGER);FORWARD;
  105. PROCEDURE ENDCMD;FORWARD;
  106. PROCEDURE XCLOSE(FD:FILEDESC);FORWARD;
  107. FUNCTION MUSTCREATE(VAR NAME:XSTRING;MODE:INTEGER):
  108. FILEDESC;FORWARD;
  109. FUNCTION CREATE(VAR NAME:XSTRING;MODE:INTEGER):FILEDESC;FORWARD;
  110. FUNCTION XLENGTH(VAR S:XSTRING):INTEGER;FORWARD;
  111. PROCEDURE STRNAME(VAR STR:STRING80;VAR XSTR:XSTRING);FORWARD;
  112. PROCEDURE ERROR(STR:STRING80);FORWARD;
  113. FUNCTION MAX(X,Y:INTEGER):INTEGER;FORWARD;
  114. PROCEDURE REMOVE(NAME:XSTRING);FORWARD;
  115. FUNCTION GETLINE(VAR STR:XSTRING;FD:FILEDESC;
  116.   SIZE:INTEGER):BOOLEAN;FORWARD;
  117.   FUNCTION OPEN(VAR NAME:XSTRING;MODE:INTEGER):
  118. FILEDESC;FORWARD;
  119. FUNCTION FDALLOC:FILEDESC;FORWARD;
  120. FUNCTION FTALLOC:FILTYP;FORWARD;
  121. FUNCTION NARGS:INTEGER;FORWARD;
  122. FUNCTION ADDSTR(C:CHARACTER;VAR OUTSET:XSTRING;
  123.   VAR J:INTEGER;MAXSET:INTEGER):BOOLEAN;FORWARD;
  124. PROCEDURE PUTSTR(STR:XSTRING;FD:FILEDESC);FORWARD;
  125. FUNCTION MUSTOPEN(VAR NAME:XSTRING;MODE:INTEGER):FILEDESC;FORWARD;
  126. FUNCTION MIN(X,Y:INTEGER):INTEGER;FORWARD;
  127. FUNCTION ISUPPER(C:CHARACTER):BOOLEAN;FORWARD;
  128. FUNCTION EQUAL(VAR STR1,STR2:XSTRING):BOOLEAN;FORWARD;
  129. FUNCTION INDEX(VAR S:XSTRING;C:CHARACTER):INTEGER;FORWARD;
  130. FUNCTION ISALPHANUM(C:CHARACTER):BOOLEAN;FORWARD;
  131. FUNCTION ESC(VAR S:XSTRING;VAR I:INTEGER):
  132.      CHARACTER;FORWARD;
  133. PROCEDURE FCOPY(FIN,FOUT:FILEDESC);FORWARD;
  134. FUNCTION CTOI(VAR S:XSTRING;VAR I:INTEGER):INTEGER;FORWARD;
  135. FUNCTION ISDIGIT(C:CHARACTER):BOOLEAN;FORWARD;
  136. FUNCTION ISLOWER(C:CHARACTER):BOOLEAN;FORWARD;
  137. FUNCTION ISLETTER(C:CHARACTER):BOOLEAN;FORWARD;
  138.  
  139. FUNCTION ISDIGIT;
  140. BEGIN
  141.   ISDIGIT:=C IN [ORD('0')..ORD('9')]
  142. END;
  143.  
  144. FUNCTION ISLOWER;
  145. BEGIN
  146.   ISLOWER:=C IN [97..122]
  147. END;
  148.  
  149. FUNCTION ISLETTER;
  150. BEGIN
  151.   ISLETTER:=C IN [65..90]+[97..122]
  152. END;
  153.  
  154. FUNCTION CTOI;
  155. VAR N,SIGN:INTEGER;
  156. BEGIN
  157.   WHILE (S[I]=BLANK) OR (S[I]=TAB)DO
  158.     I:=I+1;
  159.   IF(S[I]=MINUS) THEN
  160.     SIGN:=-1
  161.   ELSE
  162.     SIGN:=1;
  163.   IF(S[I]=PLUS)OR(S[I]=MINUS)THEN
  164.     I:=I+1;
  165.   N:=0;
  166.   WHILE(ISDIGIT(S[I])) DO BEGIN
  167.     N:=10*N+S[I]-ORD('0');
  168.     I:=I+1
  169.   END;
  170.   CTOI:=SIGN*N
  171. END;
  172.  
  173. PROCEDURE FCOPY;
  174. VAR
  175.   C:CHARACTER;
  176. BEGIN
  177.   WHILE(GETCF(C,FIN)<>ENDFILE) DO
  178.     PUTCF(C,FOUT)
  179. END;
  180.  
  181.  
  182.    
  183.  
  184. FUNCTION INDEX;
  185. VAR I:INTEGER;
  186. BEGIN
  187.   I:=1;
  188.   WHILE(S[I]<>C) AND (S[I]<>ENDSTR)DO
  189.     I:=I+1;
  190.   IF (S[I]=ENDSTR) THEN
  191.     INDEX:=0
  192.   ELSE
  193.     INDEX:=I
  194. END;
  195.  
  196. FUNCTION ESC;
  197. BEGIN
  198.   IF(S[I]<>ATSIGN) THEN
  199.     ESC:=S[I]
  200.   ELSE IF(S[I+1]=ENDSTR) THEN (*@ NOT SPECIAL AT END*)
  201.     ESC:=ATSIGN
  202.   ELSE BEGIN
  203.     I:=I+1;
  204.     IF(S[I]=ORD('N'))THEN ESC:=NEWLINE
  205.     ELSE IF (S[I]=ORD('T')) THEN
  206.       ESC:=TAB
  207.     ELSE
  208.       ESC:=S[I]
  209.   END
  210. END;
  211.  
  212. FUNCTION ISALPHANUM;
  213. BEGIN
  214.   ISALPHANUM:=C IN
  215.     [ORD('A')..ORD('Z'),ORD('0')..ORD('9'),
  216.     97..122]
  217. END;
  218.  
  219. FUNCTION MAX;
  220. BEGIN
  221.   IF(X>Y)THEN
  222.     MAX:=X
  223.   ELSE
  224.     MAX:=Y
  225. END;
  226.  
  227.  
  228. FUNCTION MIN;
  229. BEGIN
  230.   IF X<Y THEN
  231.     MIN:=X
  232.   ELSE
  233.     MIN:=Y
  234. END;
  235.  
  236.  
  237. FUNCTION ISUPPER;
  238.   BEGIN
  239.     ISUPPER:=C IN [ORD('A')..ORD('Z')]
  240.   END;
  241.  
  242.  
  243. FUNCTION XLENGTH;
  244. VAR
  245.   N:INTEGER;
  246. BEGIN
  247.   N:=1;
  248.   WHILE(S[N]<>ENDSTR)DO
  249.     N:=N+1;
  250.   XLENGTH:=N-1
  251. END;
  252.  
  253. FUNCTION GETARG;
  254. BEGIN
  255.   IF((N<1)OR(CMDARGS<N))THEN
  256.     GETARG:=FALSE
  257.   ELSE BEGIN
  258.     SCOPY(CMDLIN,CMDIDX[N],S,1);
  259.     GETARG:=TRUE
  260.   END
  261. END;(*GETARG*)
  262.  
  263.  
  264.   PROCEDURE SCOPY;
  265.   BEGIN
  266.     WHILE(SRC[I]<>ENDSTR)DO BEGIN
  267.       DEST[J]:=SRC[I];
  268.       I:=I+1;
  269.       J:=J+1
  270.     END;
  271.     DEST[J]:=ENDSTR;
  272.   END;
  273.   
  274.   
  275.   
  276. (*$I-*)
  277. FUNCTION CREATE;
  278. VAR
  279.   FD:FILEDESC;
  280.   SNM:STRING80;
  281. BEGIN
  282.   FD:=FDALLOC;
  283.   IF(FD<>IOERROR)THEN BEGIN
  284.   STRNAME(SNM,NAME);
  285.   CASE (CMDFIL[FD])OF
  286.   FIL1:
  287.     begin assign(FILE1,SNM);rewrite(FILE1) end;
  288.   FIL2:begin assign(FILE2,SNM);rewrite(FILE2) end;
  289.   FIL3:begin assign(FILE3,SNM);rewrite(FILE3) end;
  290.   FIL4:begin assign(FILE4,SNM);rewrite(FILE4) end
  291.   END;
  292.   IF(IORESULT<>0)THEN BEGIN
  293.     XCLOSE(FD);
  294.     FD:=IOERROR
  295.   END
  296. END;
  297. CREATE:=FD;
  298. END;
  299. (*$I+*)
  300.  
  301. PROCEDURE STRNAME;
  302. VAR I:INTEGER;
  303. BEGIN
  304.   STR:='.PAS';
  305.   I:=1;
  306.   WHILE(XSTR[I]<>ENDSTR)DO BEGIN
  307.     INSERT('X',STR,I);
  308.     STR[I]:=CHR(XSTR[I]);
  309.     I:=I+1
  310.   END
  311. END;
  312. PROCEDURE ERROR;
  313. BEGIN
  314.   WRITELN(STR);
  315.   HALT
  316. END;
  317.  
  318. FUNCTION MUSTCREATE;
  319. VAR
  320.   FD:FILEDESC;
  321. BEGIN
  322.   FD:=CREATE(NAME,MODE);
  323.   IF(FD=IOERROR)THEN BEGIN
  324.     PUTSTR(NAME,STDERR);
  325.     ERROR('  :CAN''T CREATE FILE')
  326.   END;
  327.   MUSTCREATE:=FD
  328. END;
  329.  
  330. FUNCTION NARGS;
  331. BEGIN
  332.   NARGS:=CMDARGS
  333. END;
  334.  
  335. PROCEDURE REMOVE;
  336. VAR
  337.   FD:FILEDESC;
  338. BEGIN
  339.   FD:=OPEN(NAME,IOREAD);
  340.   IF(FD=IOERROR)THEN
  341.   WRITELN('CAN''T REMOVE FILE')
  342.   ELSE BEGIN
  343.     CASE (CMDFIL[FD]) OF
  344.     FIL1:CLOSE(FILE1);
  345.     FIL2:CLOSE(FILE2);
  346.     FIL3:CLOSE(FILE3);
  347.     FIL4:CLOSE(FILE4);
  348.     END
  349.   END;
  350.   CMDFIL[FD]:=CLOSED
  351. END;
  352.  
  353. FUNCTION GETLINE;
  354. VAR I,ii:INTEGER;
  355.     DONE:BOOLEAN;
  356.     CH:CHARACTER;
  357. BEGIN
  358.  I:=0;
  359.  REPEAT
  360.    DONE:=TRUE;
  361.    CH:=GETCF(CH,FD);
  362.    IF(CH=ENDFILE) THEN
  363.      I:=0
  364.    ELSE IF (CH=NEWLINE) THEN BEGIN
  365.      I:=I+1;
  366.      STR[I]:=NEWLINE
  367.    END
  368.    ELSE IF (SIZE-2<=I) THEN BEGIN
  369.      WRITELN('LINE TOO LONG');
  370.      I:=I+1;
  371.      STR[I]:=NEWLINE
  372.    END
  373.    ELSE BEGIN
  374.      DONE:=FALSE;
  375.      I:=I+1;
  376.      STR[I]:=CH;
  377.    END
  378.  UNTIL(DONE);
  379.  STR[I+1]:=ENDSTR;
  380. GETLINE:=(0<I)
  381. END;(*GETLINE*)
  382.  
  383. (*$I-*)
  384. FUNCTION OPEN;
  385. VAR FD:FILEDESC;
  386. SNM:STRING80;
  387. BEGIN
  388.   FD:=FDALLOC;
  389.   IF(FD<>IOERROR) THEN BEGIN
  390.     STRNAME(SNM,NAME);
  391.     CASE (CMDFIL[FD]) OF
  392.     FIL1:begin assign(FILE1,SNM);RESET(FILE1) end;
  393.     FIL2:begin assign(FILE2,SNM);RESET(FILE2) end;
  394.     FIL3:begin assign(FILE3,SNM);RESET(FILE3) end;
  395.     FIL4:begin assign(FILE4,SNM);RESET(FILE4) end
  396.     END;
  397.     IF(IORESULT<>0) THEN BEGIN
  398.       XCLOSE(FD);
  399.       FD:=IOERROR
  400.     END
  401.   END;
  402.   OPEN:=FD
  403. END;
  404. (*$I+*)
  405.  
  406. FUNCTION FTALLOC;
  407. VAR DONE:BOOLEAN;
  408.    FT:FILTYP;
  409. BEGIN
  410.   FT:=FIL1;
  411.   REPEAT
  412.     DONE:=(NOT CMDOPEN[FT] OR (FT=FIL4));
  413.     IF(NOT DONE) THEN
  414.       FT:=SUCC(FT)
  415.   UNTIL (DONE);
  416.   IF(CMDOPEN[FT]) THEN
  417.     FTALLOC:=CLOSED
  418.   ELSE
  419.     FTALLOC:=FT
  420. END;
  421.  
  422. FUNCTION FDALLOC;
  423. VAR DONE:BOOLEAN;
  424. FD:FILEDESC;
  425. BEGIN
  426.   FD:=STDIN;
  427.   DONE:=FALSE;
  428.   WHILE(NOT DONE) DO
  429.     IF((CMDFIL[FD]=CLOSED) OR (FD=MAXOPEN))THEN
  430.       DONE:=TRUE
  431.     ELSE FD:=SUCC(FD);
  432.   IF(CMDFIL[FD]<>CLOSED) THEN
  433.     FDALLOC:=IOERROR
  434.   ELSE BEGIN
  435.     CMDFIL[FD]:=FTALLOC;
  436.     IF(CMDFIL[FD]=CLOSED) THEN
  437.       FDALLOC:=IOERROR
  438.     ELSE BEGIN
  439.       CMDOPEN[CMDFIL[FD]]:=TRUE;
  440.       FDALLOC:=FD
  441.     END
  442.   END
  443. END;(*FDALLOC*)
  444.  
  445.     PROCEDURE ENDCMD;
  446. VAR FD:FILEDESC;
  447. BEGIN
  448.   FOR FD:=STDIN TO MAXOPEN DO
  449.     XCLOSE(FD)
  450. END;
  451.  
  452. PROCEDURE XCLOSE;
  453. BEGIN
  454.   CASE (CMDFIL[FD])OF
  455.   CLOSED,STDIO:;
  456.   FIL1:CLOSE(FILE1);
  457.   FIL2:CLOSE(FILE2);
  458.   FIL3:CLOSE(FILE3);
  459.   FIL4:CLOSE(FILE4)
  460.   END;
  461.   CMDOPEN[CMDFIL[FD]]:=FALSE;
  462.   CMDFIL[FD]:=CLOSED
  463. END;
  464.  
  465. FUNCTION ADDSTR;
  466. BEGIN
  467.   IF(J>MAXSET)THEN
  468.     ADDSTR:=FALSE
  469.   ELSE BEGIN
  470.     OUTSET[J]:=C;
  471.     J:=J+1;
  472.     ADDSTR:=TRUE
  473.   END
  474. END;
  475.  
  476. PROCEDURE PUTSTR;
  477. VAR I:INTEGER;
  478. BEGIN
  479.   I:=1;
  480.   WHILE(STR[I]<>ENDSTR) DO BEGIN
  481.     PUTCF(STR[I],FD);
  482.     I:=I+1
  483.   END
  484. END;
  485. FUNCTION MUSTOPEN;
  486. VAR FD:FILEDESC;
  487. BEGIN
  488.   FD:=OPEN(NAME,MODE);
  489.   IF(FD=IOERROR)THEN BEGIN
  490.     PUTSTR(NAME,STDERR);
  491.     WRITELN(':  CAN''T OPEN FILE')
  492.   END;
  493.   MUSTOPEN:=FD
  494. END;
  495.  
  496. FUNCTION GETKBD;
  497.  
  498. VAR
  499.     DONE:BOOLEAN;
  500.     i:integer;
  501.     ch:char;
  502.  
  503. BEGIN
  504. IF (KBDN<=0)
  505. THEN
  506.     BEGIN
  507.     KBDNEXT:=1;
  508.     DONE:=FALSE;
  509.     if (kbdn=-2)
  510.     then
  511.         begin
  512.         readln;
  513.         kbdn:=0
  514.         end
  515.     else if (kbdn<0)
  516.     then
  517.         done:=true;
  518.     WHILE(NOT DONE)
  519.     DO
  520.         BEGIN
  521.         kbdn:=kbdn+1;
  522.         DONE:=TRUE;
  523.         if (eof(TRM))
  524.         then
  525.             kbdn:=-1
  526.         else if eoln(TRM)
  527.         then
  528.             begin
  529.             kbdline[kbdn]:=NEWLINE;
  530.             readln(TRM);
  531.             end
  532.         else if (MAXSTR-1<=kbdn)
  533.         then
  534.             begin
  535.             writeln('Line too long');
  536.             kbdline[kbdn]:=newline
  537.             end
  538.         ELSE
  539.             begin
  540.             read(TRM,ch);
  541.             kbdline[kbdn]:=ord(ch);
  542.             if (ord(ch)in [0..7,9..12,14..31])
  543.             then
  544.                 write('^',chr(ord(ch)+64))
  545.             else if (kbdline[kbdn]<>BACKSPACE)
  546.             then
  547.                 {do nothing}
  548.             ELSE
  549.                 begin
  550.                 write(ch,' ',ch);
  551.                 if (1<kbdn)
  552.                 then
  553.                     begin
  554.                     kbdn:=kbdn-2;
  555.                     if kbdline[kbdn+1]in[0..31]
  556.                     then
  557.                         write(ch,' ',ch)
  558.                     end
  559.                 ELSE
  560.                     kbdn:=kbdn-1
  561.                 end;
  562.             done:=false
  563.             end;
  564.         END
  565.     END;
  566. reset(TRM);
  567. IF(KBDN<=0)
  568. THEN
  569.     C:=ENDFILE
  570. ELSE
  571.     BEGIN
  572.     C:=KBDLINE[KBDNEXT];
  573.     KBDNEXT:=KBDNEXT+1;
  574.     if (c=NEWLINE)
  575.     then
  576.         begin
  577.         reset(TRM);
  578.         kbdn:=-2;
  579.         end
  580.     ELSE
  581.         KBDN:=KBDN-1
  582.     END;
  583.     GETKBD:=C
  584. END;
  585.  
  586.  FUNCTION FGETCF;
  587.  VAR CH:CHAR;
  588.  BEGIN
  589.    IF(EOF(FIL))THEN
  590.       FGETCF:=ENDFILE
  591.    ELSE IF(EOLN(FIL)) THEN BEGIN
  592.       READLN(FIL);
  593.       FGETCF:=NEWLINE
  594.    END
  595.    ELSE BEGIN
  596.      READ(FIL,CH);
  597.      FGETCF:=ORD(CH);
  598.    END;
  599.  END;
  600.  
  601.  FUNCTION GETCF;
  602.  BEGIN
  603.    CASE(CMDFIL[FD])OF
  604.    STDIO:C:=GETKBD(C);
  605.    FIL1:C:=FGETCF(FILE1);
  606.    FIL2:C:=FGETCF(FILE2);
  607.    FIL3:C:=FGETCF(FILE3);
  608.    FIL4:C:=FGETCF(FILE4);
  609.    END;
  610.  
  611.    GETCF:=C
  612.  END;
  613.  
  614. FUNCTION GETC;
  615. BEGIN
  616.   GETC:=GETCF(C,STDIN)
  617. END;
  618.  
  619.  PROCEDURE FPUTCF;
  620.  BEGIN
  621.   IF(C=NEWLINE)THEN
  622.     WRITELN(FIL)
  623.   ELSE
  624.     WRITE(FIL,CHR(C))
  625. END;
  626.  
  627. PROCEDURE PUTCF;
  628. BEGIN
  629.   CASE (CMDFIL[FD]) OF
  630.   STDIO:FPUTCF(C,CON);
  631.   FIL1:FPUTCF(C,FILE1);
  632.   FIL2:FPUTCF(C,FILE2);
  633.   FIL3:FPUTCF(C,FILE3);
  634.   FIL4:FPUTCF(C,FILE4)
  635.   END
  636. END;
  637.  
  638.  
  639. PROCEDURE PUTC;
  640. BEGIN
  641.   PUTCF(C,STDOUT);
  642. END;
  643.  
  644. FUNCTION ITOC;
  645. BEGIN
  646.   IF(N<0)THEN BEGIN
  647.     S[I]:=ORD('-');
  648.     ITOC:=ITOC(-N,S,I+1);
  649.   END
  650.   ELSE BEGIN
  651.     IF (N>=10)THEN
  652.       I:=ITOC(N DIV 10,S, I);
  653.     S[I]:=N MOD 10 + ORD('0');
  654.     S[I+1]:=ENDSTR;
  655.     ITOC:=I+1;
  656.   END
  657. END;
  658.  
  659. PROCEDURE PUTDEC;
  660. VAR I,ND:INTEGER;
  661.   S:XSTRING;
  662. BEGIN
  663.   ND:=ITOC(N,S,1);
  664.   FOR I:=ND TO W DO
  665.     PUTC(BLANK);
  666.   FOR I:=1 TO ND-1 DO
  667.     PUTC(S[I])
  668. END;
  669.   
  670. FUNCTION EQUAL;
  671. VAR
  672.   I:INTEGER;
  673. BEGIN
  674.   I:=1;
  675.   WHILE(STR1[I]=STR2[I])AND(STR1[I]<>ENDSTR) DO
  676.     I:=I+1;
  677.   EQUAL:=(STR1[I]=STR2[I])
  678. END;
  679.  
  680.  
  681.  
  682.  
  683.