home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / PASCAL / FILER.ZIP / STARTER.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1985-11-18  |  10.2 KB  |  296 lines

  1. (***************************************************************)
  2. (*                                                             *)
  3. (*        FILER A LA PASCAL DATA BASE SOURCE CODE FILE         *)
  4. (*                                                             *)
  5. (*        (C) 1985 by  John M. Harlan                          *)
  6. (*                     24000 Telegraph                         *)
  7. (*                     Southfield, MI. 48034                   *)
  8. (*                                                             *)
  9. (*     The FILER GROUP of programs is released on a "FREE      *)
  10. (*     SOFTWARE" basis.  The recipient is free to examine      *)
  11. (*     and use the software with the understanding that if     *)
  12. (*     the FILER GROUP of programs prove to be of use and      *)
  13. (*     value,  a contribution to the author is encouraged.     *)
  14. (*                                                             *)
  15. (*     While reasonable effort has been made to ensure the     *)
  16. (*     reliability of the FILER GROUP of programs, no war-     *)
  17. (*     ranty is given. The recipient uses the programs at      *)
  18. (*     his own risk  and in no event shall the author be       *)
  19. (*     liable for damages arising from their use.              *)
  20. (*                                                             *)
  21. (*                                                             *)
  22. (***************************************************************)
  23.  
  24.  
  25. PROGRAM STARTER; { ONE OF THE FILER GROUP OF PROGRAMS }
  26. {  A GENERALIZED FRAMEWORK FOR A CUSTOMIZED OUTPUT REPORT  }
  27. {  STARTER.PAS  VERSION 2.0 }
  28. {  INCLUDE FILES : STARTER1.PAS }
  29. {  NOV 15, 1984 }
  30.  
  31. TYPE
  32.   RANGE          = ARRAY[1..256] OF CHAR;
  33.   STRING60       = STRING[60];
  34.   STRING20       = STRING[20];
  35.   NAMESTR        = STRING[12];
  36.  
  37. VAR
  38.   FILERECCHGD      : BOOLEAN;
  39.   FILEEXISTS       : BOOLEAN;
  40.   RECADDEDTOFILE   : BOOLEAN;
  41.  
  42.   CH               : CHAR;
  43.  
  44.   FILENAME       : STRING[6];
  45.   FILEDATE,
  46.   CURRDATE       : STRING[8];
  47.   SOURCENAME     : STRING[14];
  48.   ANS            : STRING60;
  49.   MESSAGE        : STRING60;
  50.   PREVCONTENTS   : STRING60;
  51.  
  52.   W,X,Z, CODE, LEN,
  53.   MAXNBRREC, NBRRECUSED, RCDLEN,
  54.   BLOCKINGFACTOR, FIELDPERRECORD,
  55.   DATARECORD, DISKRECORD, PRECBYTE,
  56.   DISKRECNOWINMEM, NBRDISKRECUSED,
  57.   LASTRECUSED, FIRST,
  58.   ASCII,PAGE,LINE,PAGEFULLLINECOUNT          :    INTEGER;
  59.  
  60.   NUMVALUE                                   :    REAL;
  61.  
  62.   LABELLENGTH, DATALEN, DATAFORM,
  63.   LABELPOSN, DATAPOSN, ROW,
  64.   COLUMN, FIELDNBR                  :    ARRAY[1..32] OF INTEGER;
  65.   LBL                               :    ARRAY[1..384] OF CHAR;
  66.   GETDATA                           :    RANGE;
  67.   ASCIIFIELD                        :    ARRAY[1..32] OF STRING60;
  68.   NUMFIELD                          :    ARRAY[1..32] OF REAL;
  69.   SUBTOTAL                          :    ARRAY[1..32] OF REAL;
  70.   GRANDTOTAL                        :    ARRAY[1..32] OF REAL;
  71.  
  72.   SOURCE                            :    FILE;
  73. {================================================================}
  74. {        BINARY CODED DECIMAL TO INTEGER FUNCTION                }
  75. {================================================================}
  76. FUNCTION BCDTOIN (CHA : CHAR) : INTEGER;
  77. BEGIN
  78.   BCDTOIN := ORD(CHA) - TRUNC(ORD(CHA)/16)*6;
  79. END;
  80. {================================================================}
  81. {             CHARACTER TO INTEGER FUNCTION                      }
  82. {================================================================}
  83. FUNCTION CHTOIN(VAR CHARRAY : RANGE; START, LEN : INTEGER)  : INTEGER;
  84. VAR
  85.   CODE, RESULT : INTEGER;
  86.   WORKSTRING   : STRING[10];
  87. BEGIN
  88.   WORKSTRING := '';
  89.   FOR RESULT := 0 TO LEN-1  DO
  90.     BEGIN
  91.       IF CHARRAY[START + RESULT ] = ' ' THEN
  92.         WORKSTRING := WORKSTRING + '0'
  93.       ELSE WORKSTRING := WORKSTRING + CHARRAY[START+RESULT];
  94.     END;
  95.   VAL(WORKSTRING,RESULT,CODE);
  96.   CHTOIN := RESULT;
  97. END;
  98. {================================================================}
  99. {               GET DATA FROM ARRAY PROCEDURE                    }
  100. {================================================================}
  101. PROCEDURE GETDATAFROMARRAY(VAR MESSAGE : STRING60; Z : INTEGER);
  102. VAR W :  INTEGER;
  103. BEGIN
  104.   MESSAGE := '';
  105.   FOR W := PRECBYTE+DATAPOSN[Z] TO PRECBYTE+DATAPOSN[Z+1]-1 DO
  106.     MESSAGE := MESSAGE + GETDATA[W];
  107. END;
  108. {================================================================}
  109. {               TIDE (EDIT BACKWARDS) PROCEDURE                  }
  110. {================================================================}
  111. PROCEDURE TIDE( VAR MESSAGE : STRING60);
  112. VAR W  :  INTEGER;
  113. BEGIN
  114.   FOR W := LENGTH(MESSAGE) DOWNTO 1 DO
  115.     BEGIN
  116.       IF MESSAGE[W] IN [',', '$', '+'] THEN
  117.         BEGIN
  118.           DELETE(MESSAGE,W,1);
  119.           MESSAGE := ' ' + MESSAGE;
  120.         END;
  121.     END;
  122. END;
  123. {===============================================================}
  124. {                      FUNCTION EDITNBR                         }
  125. {===============================================================}
  126. FUNCTION EDITNBR(X: REAL; Y,Z: INTEGER; DOLLAR: CHAR ) : STRING20;
  127.  
  128. VAR
  129.   NUMSTRING : STRING[24];
  130.  
  131. BEGIN    { CONVERT THE REAL NUMBER TO A STRING VALUE }
  132.   STR(X:18:Z,NUMSTRING);
  133.   IF Z = 0 THEN Z := 16  { FIRST POSSIBLE COMMA LOCATION  }
  134.   ELSE Z := POS('.',NUMSTRING)-3;  {    DITTO             }
  135.  
  136.   WHILE Z > 1 DO  {  INSERT COMMAS/SPACES IN THE NUMBER  }
  137.     BEGIN
  138.       IF NUMSTRING[Z-1] IN [' ','-'] THEN
  139.         INSERT(' ',NUMSTRING,Z)
  140.       ELSE INSERT(',',NUMSTRING,Z);
  141.       Z := Z -3 ;  {  COMMAS OCCUR EVERY THIRD CHARACTER  }
  142.     END;
  143.  
  144.   {  FIND THE FIRST NON SPACE CHARACTER IN THE NUMBER }
  145.   Z := 0;
  146.   REPEAT
  147.     Z := Z + 1;
  148.  UNTIL NUMSTRING[Z] <> ' ';
  149.  
  150.   { DELETE ANY SPACE FOLLOWING A MINUS SIGN }
  151.   IF NUMSTRING[Z] = '-' THEN
  152.     BEGIN
  153.       IF NUMSTRING[Z+1] = ' ' THEN DELETE(NUMSTRING,Z+1,1);
  154.       IF DOLLAR = '$' THEN INSERT('$',NUMSTRING,Z+1);
  155.     END
  156.  
  157.   { ADD THE $/SPACE CHARACTER TO THE BEGINNING OF THE NUMBER }
  158.   ELSE NUMSTRING[Z-1] := DOLLAR;
  159.  
  160.   { REPLACE THE NUMBER WITH A FIELD OF '<' IF IT IS TOO BIG  }
  161.   Z := LENGTH(NUMSTRING)-Y;
  162.   IF NUMSTRING[Z-1] = '-' THEN
  163.       FOR Z := Y DOWNTO 0 DO NUMSTRING[Z] := '<'
  164.   ELSE
  165.     BEGIN
  166.       IF NUMSTRING[Z] IN ['0'..'9',',','-','.'] THEN
  167.           FOR Z := Y DOWNTO 0 DO NUMSTRING[Z] := '<';
  168.     END;
  169.   EDITNBR := COPY(NUMSTRING,Z+1,Y);
  170.  
  171. END;
  172. {================================================================}
  173. {               STRING TO REAL NUMBER PROCEDURE                  }
  174. {================================================================}
  175. PROCEDURE STRINGTOREAL(VAR SOURCE:STRING60;VAR NUMB:REAL;VAR CODE:INTEGER);
  176. VAR
  177.   W  :  INTEGER;
  178.   CONDITION  :  BOOLEAN;
  179. BEGIN
  180.   W := 1;
  181.   NUMB := 0;
  182.   CONDITION := TRUE;
  183.   TIDE(SOURCE); { ELIMINATE PUNCTUATION }
  184.   REPEAT  { UNTIL CONDITION = FALSE }
  185.     IF SOURCE[W] = ' ' THEN DELETE(SOURCE,1,1)
  186.     ELSE CONDITION := FALSE;
  187.     IF LENGTH(SOURCE) = 0 THEN
  188.       BEGIN
  189.         SOURCE := '0';
  190.         CONDITION := FALSE;
  191.       END;
  192.   UNTIL CONDITION = FALSE;
  193.   IF LENGTH(SOURCE) = 1 THEN CONDITION := TRUE;
  194.   WHILE CONDITION = FALSE DO
  195.     BEGIN
  196.       IF SOURCE[W] = ' ' THEN
  197.         BEGIN
  198.           CONDITION := TRUE;
  199.           W := W-2;
  200.         END;
  201.       IF LENGTH(SOURCE) = W THEN
  202.         BEGIN
  203.           CONDITION := TRUE;
  204.           W := W-1;
  205.         END;
  206.       W := W + 1;
  207.     END;
  208.   SOURCE := COPY(SOURCE,1,W);
  209.   VAL( SOURCE,NUMB,CODE );
  210. END;
  211. {================================================================}
  212. {           CALCULATE DISKRECORD & PRECBYTE PROCEDURE            }
  213. {================================================================}
  214. PROCEDURE CALCULATE;
  215.   BEGIN
  216.     DISKRECORD := TRUNC((DATARECORD-1)/BLOCKINGFACTOR)*2+7;
  217.     PRECBYTE := ((DATARECORD-1) MOD BLOCKINGFACTOR)*RCDLEN;
  218.   END;
  219. {================================================================}
  220. {                   GET DATA RECORD PROCEDURE                    }
  221. {================================================================}
  222. PROCEDURE GETDATAREC;
  223.   BEGIN
  224.     CALCULATE;
  225.     IF DISKRECORD <> DISKRECNOWINMEM THEN
  226.       BEGIN
  227.         IF FILERECCHGD = TRUE THEN
  228.           BEGIN
  229.             IF DISKRECNOWINMEM > NBRDISKRECUSED THEN
  230.               BEGIN                 { GET NEXT AVAILABLE RECORD }
  231.                 SEEK(SOURCE,NBRDISKRECUSED+2);
  232.                 NBRDISKRECUSED := DISKRECNOWINMEM;
  233.               END
  234.             ELSE
  235.               BEGIN
  236.                 SEEK(SOURCE,DISKRECNOWINMEM);
  237.               END;
  238.             BLOCKWRITE(SOURCE,GETDATA,2);  {SAVE CHANGED DATA}
  239.             FILERECCHGD := FALSE;
  240.           END;
  241.                                     
  242.         IF DISKRECORD <= NBRDISKRECUSED THEN
  243.           BEGIN
  244.             SEEK(SOURCE,DISKRECORD);
  245.             BLOCKREAD(SOURCE,GETDATA,2);         {  RECORD DATA  }
  246.          END
  247.         ELSE FILLCHAR(GETDATA[1],256,' '); {SPACES FOR EMPTY REC }
  248.  
  249.        DISKRECNOWINMEM := DISKRECORD;
  250.       END;
  251.   END;
  252. {===============================================================}
  253. {                       FUNCTION EXIST                          }
  254. {===============================================================}
  255. FUNCTION EXIST(FILENAME : NAMESTR) : BOOLEAN;
  256. VAR
  257.   FIL :  FILE;
  258. BEGIN
  259.   ASSIGN(FIL,FILENAME);
  260.   {$I-}
  261.   RESET(FIL);
  262.   {$I+}
  263.   EXIST := (IORESULT = 0)
  264. END;
  265. {================================================================}
  266. {           READ RECORD AND PLACE DATA IN ARRAYS                 }
  267. {================================================================}
  268. PROCEDURE MOVERECORDDATATOARRAY;
  269.   BEGIN
  270.     CALCULATE;
  271.     GETDATAREC;
  272.     FOR Z := 1 TO FIELDPERRECORD DO
  273.       BEGIN
  274.         GETDATAFROMARRAY(ASCIIFIELD[Z],Z);
  275.         IF DATAFORM[Z] <> ASCII THEN
  276.           BEGIN
  277.             STRINGTOREAL(ASCIIFIELD[Z],NUMFIELD[Z],CODE);
  278.           END
  279.         ELSE NUMFIELD[Z] := 0;
  280.       END;
  281.   END;
  282. {================================================================}
  283. {           FUNCTION GET NUMBER IN GETDATA FIELD ( Z )           }
  284. {================================================================}
  285. FUNCTION FNBRINFLD(Z : INTEGER) : REAL;
  286. VAR
  287.   REALVAL : REAL;
  288.   BEGIN
  289.     GETDATAFROMARRAY(ANS,Z);
  290.     IF DATAFORM[Z] <> ASCII THEN
  291.       STRINGTOREAL(ANS,REALVAL,CODE)
  292.     ELSE REALVAL := 0;
  293.     FNBRINFLD := REALVAL;
  294.   END;
  295. {$ISTARTER1.PAS}
  296.