home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS - Coast to Coast / simteldosarchivecoasttocoast2.iso / calculat / pibcal11.zip / DOGUYS.PAS < prev    next >
Pascal/Delphi Source File  |  1985-03-08  |  27KB  |  712 lines

  1. (*--------------------------------------------------------------------------*)
  2. (*                 DoExit --- Set flags to terminate PibCalc                *)
  3. (*--------------------------------------------------------------------------*)
  4.  
  5. PROCEDURE DoExit;
  6.  
  7. (*--------------------------------------------------------------------------*)
  8. (*                                                                          *)
  9. (*     Procedure:  DoExit                                                   *)
  10. (*                                                                          *)
  11. (*     Purpose:    Sets flags to terminate PibCalc                          *)
  12. (*                                                                          *)
  13. (*     Calling sequence:                                                    *)
  14. (*                                                                          *)
  15. (*        DoExit;                                                           *)
  16. (*                                                                          *)
  17. (*     Calls:                                                               *)
  18. (*                                                                          *)
  19. (*        CheckEol;                                                         *)
  20. (*                                                                          *)
  21. (*     Remarks:    Done is set TRUE here.                                   *)
  22. (*                                                                          *)
  23. (*--------------------------------------------------------------------------*)
  24.  
  25. BEGIN   (* DoExit *)
  26.  
  27.    CheckEol;
  28.                                    (* Set global flag to terminate run *)
  29.    done := TRUE;
  30.  
  31. END     (* DoExit *);
  32.  
  33. (*--------------------------------------------------------------------------*)
  34. (*                 DoHelp --- Display online help                           *)
  35. (*--------------------------------------------------------------------------*)
  36.  
  37. PROCEDURE DoHelp;
  38.  
  39. (*--------------------------------------------------------------------------*)
  40. (*                                                                          *)
  41. (*     Procedure:  DoHelp                                                   *)
  42. (*                                                                          *)
  43. (*     Purpose:    Display online help                                      *)
  44. (*                                                                          *)
  45. (*     Calling sequence:                                                    *)
  46. (*                                                                          *)
  47. (*        DoHelp;                                                           *)
  48. (*                                                                          *)
  49. (*     Calls:                                                               *)
  50. (*                                                                          *)
  51. (*        CheckEol;                                                         *)
  52. (*                                                                          *)
  53. (*     Remarks:                                                             *)
  54. (*                                                                          *)
  55. (*        The file PIBCALC.HLP must be accessible in order for the help     *)
  56. (*        to be displayed.                                                  *)
  57. (*                                                                          *)
  58. (*--------------------------------------------------------------------------*)
  59.  
  60. LABEL
  61.    1, 2;
  62.  
  63. VAR
  64.    nlines:   INTEGER;
  65.    x:        CHAR;
  66.    astflag:  BOOLEAN;
  67.    astcount: INTEGER;
  68.    HelpText: AnyStr;
  69.    I:        INTEGER;
  70.    L:        INTEGER;
  71.  
  72. BEGIN (* DoHelp *)
  73.  
  74.                                    (* Get help file *)
  75.  
  76.    ASSIGN( HelpFile, 'PIBCALC.HLP' );
  77.       (*$I-*)
  78.    RESET ( HelpFile );
  79.       (*$I+*
  80.  
  81.                                    (* If can't be opened, skip help *)
  82.  
  83.    IF IoResult <> 0 THEN
  84.       BEGIN
  85.          Writeln('File PIBHELP.HLP cannot be accessed, no HELP available.');
  86.          GOTO 1;
  87.       END;
  88.                                    (* lines per screen-full *)
  89.    nlines := 23;
  90.                                    (* loop over lines in file *)
  91.    REPEAT
  92.                                    (* Screen full -- prompt for next action *)
  93.                                    (* <CR> continues, S stops listing,      *)
  94.                                    (* C continues non-stop, ? get options.  *)
  95.  
  96.       IF nlines = 0 THEN
  97.          BEGIN  (* NLINES = 0 *)
  98.  
  99.             2: TEXTCOLOR( Prompt_Color );
  100.                WRITE('S/C/?/RETURN: ');
  101.                TEXTCOLOR( ForeGround_Color );
  102.  
  103.                x := ' ';
  104.                READLN(x);
  105.                WRITELN;
  106.  
  107.                CASE x OF
  108.                   'S','s' : GOTO 1;
  109.                   'C','c' : nlines := MAXINT;
  110.                   ' ',cr  : nlines := 23;
  111.                   ELSE
  112.                      BEGIN  (* DISPLAY INSTRUCTIONS *)
  113.                         WRITELN;
  114.                         TEXTCOLOR( Prompt_Color );
  115.                         WRITELN('Your options are:');
  116.                         WRITELN;
  117.                         WRITELN('S - Stop the listing.');
  118.                         WRITELN('C - Continue with no more prompting.');
  119.                         WRITELN('? - Display these instructions.');
  120.                         WRITELN('Just carriage return - ',
  121.                                 'display next page.');
  122.                         WRITELN;
  123.                         TEXTCOLOR( ForeGround_Color );
  124.                         GOTO 2;
  125.                      END (* DISPLAY INSTRUCTIONS *);
  126.  
  127.                   END (* CASE *);
  128.  
  129.          END (* NLINES = 0 *);
  130.  
  131.       astflag  := TRUE;
  132.       astcount := 0;
  133.                                    (* Read next line from help file *)
  134.  
  135.       READLN( HelpFile , HelpText );
  136.  
  137.       L := LENGTH( HelpText );
  138.  
  139.                                    (* Check initial '*' flagging *)
  140.  
  141.       I := 1;
  142.  
  143.       WHILE astflag DO
  144.          BEGIN
  145.  
  146.             IF I <= L THEN
  147.                IF HelpText[I] = '*' THEN
  148.                   BEGIN
  149.                      HelpText[I] := ' ';
  150.                      astcount    := astcount + 1;
  151.                   END
  152.                ELSE
  153.                   astflag := FALSE
  154.             ELSE
  155.                astflag := FALSE;
  156.  
  157.             I := I + 1;
  158.  
  159.          END;
  160.                                    (* Select display color *)
  161.       IF astcount = 3 THEN
  162.          TEXTCOLOR( Help_Header_Color )
  163.       ELSE
  164.          TEXTCOLOR( Help_Text_Color );
  165.  
  166.                                    (* Display line of help *)
  167.       WRITELN( HelpText );
  168.                                    (* Decrement screen disploay count *)
  169.       nlines := nlines - 1;
  170.  
  171.    UNTIL (  EOF( HelpFile ) );
  172.  
  173.    CLOSE( HelpFile );
  174.  
  175.    TEXTCOLOR( Help_Text_Color );
  176.  
  177.    WRITELN;
  178.    WRITELN('For a printed listing of this help file type the DOS command');
  179.    WRITELN('PRINT PIBCALC.HLP');
  180.    WRITELN;
  181.  
  182.    TEXTCOLOR( Foreground_Color );
  183.  
  184. 1:
  185. END  (* DoHelp *);
  186.  
  187.  
  188. (*--------------------------------------------------------------------------*)
  189. (*                 DoShow --- Display variables and functions               *)
  190. (*--------------------------------------------------------------------------*)
  191.  
  192. PROCEDURE DoShow;
  193.  
  194. (*--------------------------------------------------------------------------*)
  195. (*                                                                          *)
  196. (*     Procedure:  DoShow                                                   *)
  197. (*                                                                          *)
  198. (*     Purpose:    Displays variables and functions                         *)
  199. (*                                                                          *)
  200. (*     Calling sequence:                                                    *)
  201. (*                                                                          *)
  202. (*        DoShow;                                                           *)
  203. (*                                                                          *)
  204. (*     Calls:                                                               *)
  205. (*                                                                          *)
  206. (*        CheckEol;                                                         *)
  207. (*                                                                          *)
  208. (*--------------------------------------------------------------------------*)
  209.  
  210. VAR
  211.    t: tokenty;
  212.    v: varnamty;
  213.    i: INTEGER;
  214.    j: INTEGER;
  215.  
  216. BEGIN  (* DoShow *)
  217.  
  218.                                    (* Get next token  -- *)
  219.    NextTok;
  220.                                    (* indicates if vars or funcs to be *)
  221.                                    (* displayed                        *)
  222.    t := token;
  223.                                    (* Check for garbage at EOL         *)
  224.    CheckEol;
  225.  
  226.    CASE t OF
  227.                                    (* Display variables *)
  228.  
  229.       varssy:  FOR v := 'A' TO 'Z' DO
  230.                   IF VarVals[v].def THEN Display( v , VarVals[v] );
  231.  
  232.                                    (* Display functions *)
  233.  
  234.       funcssy: FOR i := 1 TO Maxuserfuncs DO
  235.  
  236.                   WITH userfuncs[i] DO
  237.                      IF name <> '          ' THEN
  238.                         BEGIN
  239.  
  240.                            j := 1;
  241.  
  242.                                    (* Write function name *)
  243.  
  244.                            WHILE ( name[j] <> ' ' ) AND ( j <= 10 ) DO
  245.                               BEGIN
  246.                                  WRITE( name[j] );
  247.                                  j := j + 1;
  248.                               END;
  249.  
  250.                                    (* Write argument names if any *)
  251.  
  252.                            IF nparms > 0 THEN
  253.                               BEGIN
  254.  
  255.                                  WRITE('(');
  256.  
  257.                                  FOR j := 1 TO ( nparms - 1 ) DO
  258.                                     WRITE(pnames[j],',');
  259.  
  260.                                  WRITE(pnames[nparms],')')
  261.  
  262.                               END;
  263.  
  264.                            WRITE('=');
  265.  
  266.                            j := 1;
  267.                                    (* Write function definition *)
  268.  
  269.                            WHILE defn[j] <> col DO
  270.                               BEGIN
  271.                                  WRITE(defn[j]);
  272.                                  j := j + 1;
  273.                               END;
  274.  
  275.                            WRITELN;
  276.  
  277.                      END;
  278.       ELSE
  279.          SynErr;
  280.       END;
  281.  
  282. END   (* DoShow *);
  283.  
  284.  
  285. (*--------------------------------------------------------------------------*)
  286. (*                 DoEsp --- Execute subordinate program                    *)
  287. (*--------------------------------------------------------------------------*)
  288.  
  289. PROCEDURE DoEsp;
  290.  
  291. (*--------------------------------------------------------------------------*)
  292. (*                                                                          *)
  293. (*     Procedure:  DoEsp                                                    *)
  294. (*                                                                          *)
  295. (*     Purpose:    Executes subordinate program                             *)
  296. (*                                                                          *)
  297. (*     Calling sequence:                                                    *)
  298. (*                                                                          *)
  299. (*        DoEsp;                                                            *)
  300. (*                                                                          *)
  301. (*     Calls:                                                               *)
  302. (*                                                                          *)
  303. (*     Remarks:    Not yet implemented.                                     *)
  304. (*                                                                          *)
  305. (*--------------------------------------------------------------------------*)
  306.  
  307. BEGIN  (* DoEsp *)
  308.  
  309.    WRITELN('The $ command is not implemented for MS/DOS');
  310.  
  311. END    (* DoEsp *);
  312.  
  313. (*--------------------------------------------------------------------------*)
  314. (*                 DoDef --- Add user function definition                   *)
  315. (*--------------------------------------------------------------------------*)
  316.  
  317. PROCEDURE DoDef;
  318.  
  319. (*--------------------------------------------------------------------------*)
  320. (*                                                                          *)
  321. (*     Procedure:  DoDef                                                    *)
  322. (*                                                                          *)
  323. (*     Purpose:    Add user function definition                             *)
  324. (*                                                                          *)
  325. (*     Calling sequence:                                                    *)
  326. (*                                                                          *)
  327. (*        DoDef;                                                            *)
  328. (*                                                                          *)
  329. (*     Calls:                                                               *)
  330. (*                                                                          *)
  331. (*        NextTok                                                           *)
  332. (*        SynErr                                                            *)
  333. (*        CheckEol                                                          *)
  334. (*                                                                          *)
  335. (*--------------------------------------------------------------------------*)
  336.  
  337. LABEL
  338.    99 (* ERROR EXIT *);
  339.  
  340. VAR
  341.    i:     INTEGER;
  342.    fname: alfa;
  343.    found: BOOLEAN;
  344.    slot:  INTEGER;
  345.  
  346. BEGIN (* Dodef *)
  347.                                    (* Skip blanks *)
  348.  
  349.    WHILE Iline[ipos] = ' ' DO Ipos := Ipos+1;
  350.  
  351.                                    (* 1st char of function name must be *)
  352.                                    (* letter                            *)
  353.  
  354.    IF NOT (Iline[ipos] IN ['A'..'Z']) THEN
  355.       BEGIN
  356.          SynErr;
  357.          GOTO 99;
  358.       END;
  359.  
  360.    i := 0;
  361.                                    (* Pick up function name *)
  362.  
  363.    WHILE (Iline[ipos] IN ['A'..'Z','0'..'9']) AND (i < 9) DO
  364.       BEGIN
  365.          i        := i + 1;
  366.          fname[i] := Iline[ipos];
  367.          Ipos     := Ipos + 1;
  368.       END;
  369.                                    (* Blank fill function name *)
  370.  
  371.    FOR i := ( i + 1 ) TO 10 DO fname[i] := ' ';
  372.  
  373.    found := FALSE;
  374.    i     := 0;
  375.                                    (* Check if function name conflicts *)
  376.                                    (* with reserved word               *)
  377.  
  378.    WHILE ( i < Maxtoknams ) AND ( NOT found ) DO
  379.       BEGIN
  380.          i     := i + 1;
  381.          found := ( fname = toknams[i].name );
  382.       END;
  383.  
  384.    IF found THEN
  385.       BEGIN
  386.          Error('Function name conflicts with reserved word');
  387.          GOTO 99;
  388.       END;
  389.  
  390.                                    (* Find slot for function name *)
  391.  
  392.    slot := 0;
  393.                                    (* First see if this is redefinition. *)
  394.                                    (* If so, reuse current slot.         *)
  395.  
  396.    WHILE ( slot < Maxuserfuncs ) AND ( NOT found ) DO
  397.       BEGIN
  398.          slot  := slot + 1;
  399.          found := ( fname = userfuncs[slot].name );
  400.       END;
  401.  
  402.                                    (* Not redefinition -- look for *)
  403.                                    (* empty slot (name is blank)   *)
  404.    IF NOT found THEN
  405.       BEGIN
  406.  
  407.          slot := 0;
  408.  
  409.          WHILE ( slot < Maxuserfuncs ) AND ( NOT found ) DO
  410.             BEGIN
  411.                slot  := slot + 1;
  412.                found := ( userfuncs[slot].name = '          ' );
  413.             END;
  414.  
  415.                                    (* No slot found -- error *)
  416.  
  417.          IF NOT found THEN
  418.             BEGIN
  419.                Error ('No more room for user functions');
  420.                GOTO 99;
  421.             END;
  422.  
  423.       END;
  424.  
  425.    IF ErrorFlag THEN GOTO 99;
  426.  
  427.                                    (* Get definition *)
  428.    WITH userfuncs[slot] DO
  429.       BEGIN
  430.                                    (* Insert function name *)
  431.          name   := fname;
  432.          nparms := 0;
  433.                                    (* Look for '(', signalling start *)
  434.                                    (* of parameter list              *)
  435.          NextTok;
  436.  
  437.          IF token = oparsy THEN
  438.             BEGIN
  439.  
  440.                NextTok;
  441.                                    (* Ensure parameter is variable name *)
  442.  
  443.                IF token <> varsy THEN
  444.                   BEGIN
  445.                      SynErr;
  446.                      GOTO 99;
  447.                   END;
  448.  
  449.                nparms    := 1;
  450.                pnames[1] := varnam;
  451.  
  452.                                     (* Pick up any remaining parameters *)
  453.                NextTok;
  454.  
  455.                WHILE ( token = commasy ) AND ( nparms < Maxformal ) DO
  456.                   BEGIN
  457.  
  458.                      NextTok;
  459.                                    (* Check next parameter is variable name *)
  460.  
  461.                      IF token <> varsy THEN
  462.                         BEGIN
  463.                            SynErr;
  464.                            GOTO 99;
  465.                         END;
  466.  
  467.                                    (* Check for duplicate parameter names *)
  468.  
  469.                      FOR i := 1 TO nparms DO
  470.                         IF varnam = pnames[i] THEN
  471.                            BEGIN
  472.                               SynErr;
  473.                               GOTO 99;
  474.                            END;
  475.  
  476.                                    (* Insert parameter name *)
  477.  
  478.                      nparms         := nparms + 1;
  479.                      pnames[nparms] := varnam;
  480.  
  481.                                    (* Get next separator *)
  482.                      NextTok;
  483.  
  484.                   END;
  485.                                    (* ')' should follow last formal *)
  486.                                    (* parameter                     *)
  487.  
  488.                IF token <> cparsy THEN
  489.                   BEGIN
  490.                      SynErr;
  491.                      GOTO 99;
  492.                   END;
  493.  
  494.                NextTok;
  495.  
  496.             END;
  497.  
  498.             IF ErrorFlag THEN GOTO 99;
  499.  
  500.                                    (* Now pick up function definition *)
  501.                                    (* '=' should follow ')' closing   *)
  502.                                    (* formal paramater list           *)
  503.  
  504.             IF token <> equalssy THEN
  505.                BEGIN
  506.                   SynErr;
  507.                   GOTO 99;
  508.                END;
  509.  
  510.  
  511.             i := 0;
  512.                                    (* Get text of definition *)
  513.  
  514.             WHILE Iline[ipos] <> col DO
  515.                BEGIN
  516.                   i       := i + 1;
  517.                   defn[i] := Iline[ipos];
  518.                   Ipos    := Ipos + 1;
  519.                END;
  520.  
  521.             defn[i+1] := COL;
  522.  
  523.       END;
  524.  
  525. 99 : END (* Dodef *);
  526.  
  527. (*--------------------------------------------------------------------------*)
  528. (*                 DoDel --- Remove user function definition                *)
  529. (*--------------------------------------------------------------------------*)
  530.  
  531. PROCEDURE DoDel;
  532.  
  533. (*--------------------------------------------------------------------------*)
  534. (*                                                                          *)
  535. (*     Procedure:  DoDel                                                    *)
  536. (*                                                                          *)
  537. (*     Purpose:    Removes user function definition                         *)
  538. (*                                                                          *)
  539. (*     Calling sequence:                                                    *)
  540. (*                                                                          *)
  541. (*        DoDel;                                                            *)
  542. (*                                                                          *)
  543. (*     Calls:                                                               *)
  544. (*                                                                          *)
  545. (*        NextTok                                                           *)
  546. (*        SynErr                                                            *)
  547. (*        CheckEol                                                          *)
  548. (*                                                                          *)
  549. (*--------------------------------------------------------------------------*)
  550.  
  551. VAR
  552.    t: tokenty;
  553.  
  554. BEGIN  (* DoDel *)
  555.  
  556.                                    (* Pick up name of function *)
  557.    NextTok;
  558.                                    (* If not var name/function name, error *)
  559.  
  560.    IF NOT (token IN [varsy,userfuncsy]) THEN SynErr;
  561.  
  562.                                    (* Ensure no trailing garbage *)
  563.    IF ( NOT ErrorFlag ) THEN
  564.       BEGIN
  565.  
  566.          t := token;
  567.  
  568.          CheckEol;
  569.                                    (* If variable, indicate undefined, *)
  570.                                    (* if function, remove definition   *)
  571.  
  572.          IF ( NOT ErrorFlag ) THEN
  573.             IF t = varsy THEN
  574.                VarVals[varnam].def := FALSE
  575.             ELSE
  576.                userfuncs[iuserfunc].name := '          ';
  577.  
  578.      END;
  579.  
  580. END  (* DoDel *);
  581.  
  582. (*--------------------------------------------------------------------------*)
  583. (*                 DoExp --- Evaluate expression in command                 *)
  584. (*--------------------------------------------------------------------------*)
  585.  
  586. PROCEDURE DoExp;
  587.  
  588. (*--------------------------------------------------------------------------*)
  589. (*                                                                          *)
  590. (*     Procedure:  DoExp                                                    *)
  591. (*                                                                          *)
  592. (*     Purpose:    Evaluates expression in command line                     *)
  593. (*                                                                          *)
  594. (*     Calling sequence:                                                    *)
  595. (*                                                                          *)
  596. (*        DoExp;                                                            *)
  597. (*                                                                          *)
  598. (*     Calls:                                                               *)
  599. (*                                                                          *)
  600. (*        NextTok                                                           *)
  601. (*        Expression                                                        *)
  602. (*                                                                          *)
  603. (*--------------------------------------------------------------------------*)
  604.  
  605. LABEL
  606.    99 (* ERROR EXIT *);
  607.  
  608. VAR
  609.    setvar:   BOOLEAN;
  610.    vartoset: varnamty;
  611.    v:        valuety;
  612.  
  613. BEGIN (* DoExp *)
  614.  
  615.                                    (* Assume non-assignment expression *)
  616.    setvar := FALSE;
  617.                                    (* See if '=' follows token -- is an *)
  618.                                    (* assignment statement.             *)
  619.    IF token = varsy THEN
  620.    BEGIN
  621.       NextTok;
  622.       IF token = equalssy THEN
  623.          BEGIN
  624.             setvar   := TRUE;
  625.             vartoset := varnam;
  626.             NextTok;
  627.          END
  628.       ELSE
  629.          BEGIN
  630.             Ipos := 1;
  631.             NextTok;
  632.          END
  633.    END;
  634.  
  635.                                    (* Parse and execute expression *)
  636.  
  637.    Expression( dummy, Iline, Ipos, v );
  638.  
  639.                                    (* Quit if error *)
  640.    IF ErrorFlag THEN GOTO 99;
  641.                                    (* Garbage after expression ? *)
  642.    IF token <> eolsy THEN
  643.       BEGIN
  644.          SynErr;
  645.          GOTO 99;
  646.       END;
  647.                                    (* No errors -- display result *)
  648.    IF ( NOT ErrorFlag ) THEN
  649.       BEGIN
  650.          curval := v;
  651.          IF setvar THEN VarVals[vartoset] := v;
  652.          Display(' ',v);
  653.       END;
  654.  
  655. 99:
  656.  
  657. END (* DoExp *);
  658.  
  659.  
  660. (*--------------------------------------------------------------------------*)
  661. (*                 DoEdit --- Edit last command line                        *)
  662. (*--------------------------------------------------------------------------*)
  663.  
  664. PROCEDURE DoEdit;
  665.  
  666. (*--------------------------------------------------------------------------*)
  667. (*                                                                          *)
  668. (*     Procedure:  DoEdit                                                   *)
  669. (*                                                                          *)
  670. (*     Purpose:    Edits last command line.                                 *)
  671. (*                                                                          *)
  672. (*     Calling sequence:                                                    *)
  673. (*                                                                          *)
  674. (*        DoEdit;                                                           *)
  675. (*                                                                          *)
  676. (*        On output, UseEdit = TRUE and Oline contains the edited command.  *)
  677. (*                                                                          *)
  678. (*     Calls:                                                               *)
  679. (*                                                                          *)
  680. (*        TextColor                                                         *)
  681. (*        COPY                                                              *)
  682. (*        Edit_String                                                       *)
  683. (*                                                                          *)
  684. (*--------------------------------------------------------------------------*)
  685.  
  686. VAR
  687.    c:       CHAR;
  688.    i:       INTEGER;
  689.  
  690. BEGIN (* DoEdit *)
  691.  
  692.                                    (* Prompt for editing line *)
  693.    TEXTCOLOR(Prompt_Color);
  694.    WRITE('>> ');
  695.    TEXTCOLOR(ForeGround_Color);
  696.                                    (* Indicate we will use edited line *)
  697.    UseEdit := TRUE;
  698.                                    (* Strip EOL marker from command *)
  699.  
  700.    Oline   := COPY( Oline, 1, LENGTH( Oline ) - 1 );
  701.  
  702.                                    (* Edit the command *)
  703.  
  704.    c       := Edit_String( Oline, MaxStrLen, 4, WhereY, TRUE );
  705.  
  706.                                    (* Append EOL marker  *)
  707.    Oline := Oline + Col;
  708.                                    (* Prevent overwrites *)
  709.    WRITELN;
  710.  
  711. END   (* DoEdit *);
  712.