home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / PASCAL / FILER.ZIP / TRANSFER.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1985-11-18  |  14.9 KB  |  426 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 TRANSFER;  { ONE OF THE FILER GROUP OF PROGRAMS }
  26. {  PROGRAM TO TRANSFER DATA FROM ONE FILER DATA FORMAT  }
  27. {  TO A SECOND FILER DATA FORMAT                        }
  28. {  TRANSFER.PAS  REVISION 2.0 }
  29. {  INCLUDE FILES : TRANSFR1.PAS }
  30. {  JUNE 24, 1985 }
  31.  
  32. TYPE
  33.   RANGE            = ARRAY[1..256] OF CHAR;
  34.   STRING60         =  STRING[60];
  35.   STRING20         =  STRING[20];
  36.   NAMESTR          =  STRING[12];
  37.  
  38. VAR
  39.   FILERECCHGD      : BOOLEAN;    { FOR SOURCE FILE }
  40.   RECADDEDTOFILE   : BOOLEAN;    { FOR SOURCE FILE }
  41.   FILERECCHGD2     : BOOLEAN;    { FOR DESTINATION FILE }
  42.   RECADDEDTOFILE2  : BOOLEAN;    { FOR DESTINATION FILE }
  43.   FILEEXISTS       : BOOLEAN;
  44.   NULLRECORD       : BOOLEAN;
  45.  
  46.   CH               : CHAR;
  47.  
  48.   FILENAME,FILENAME2         : STRING[6];
  49.   FILEDATE,FILEDATE2,
  50.   CURRDATE                   : STRING[8];
  51.   SOURCENAME                 : STRING[14];
  52.   SOURCENAMEDAT              : STRING[14];
  53.   DESTINATIONNAME            : STRING[14];
  54.   DESTINATIONNAMEDAT         : STRING[14];
  55.  
  56.   ANS                        : STRING60;
  57.   MESSAGE                    : STRING60;
  58.   THISKEY                    : STRING60;
  59.  
  60.    W, X, Y, Z, CODE, FIRST, LEN,
  61.   MAXNBRREC, RCDLEN, DESTFIELDNBR,
  62.   BLOCKINGFACTOR, FIELDPERRECORD,
  63.   ASCII, KEYLENGTH, DESTNBR             : INTEGER;
  64.  
  65.   W2, X2, Y2, Z2, CODE2, FIRST2, LEN2,
  66.   MAXNBRREC2, RCDLEN2,
  67.   BLOCKINGFACTOR2, FIELDPERRECORD2,
  68.   ASCII2, KEYLENGTH2                    : INTEGER;
  69.  
  70.   DATARECORD, DISKRECORD, PRECBYTE,
  71.   DISKRECNOWINMEM, NBRDISKRECUSED,
  72.   NBRRECUSED,LASTRECUSED                : INTEGER;  { FOR SOURCE FILE }
  73.  
  74.   DATARECORD2, DISKRECORD2, PRECBYTE2,
  75.   DISKRECNOWINMEM2, NBRDISKRECUSED2,
  76.   NBRRECUSED2,LASTRECUSED2              : INTEGER;  { FOR DESTINATION FILE }
  77.  
  78.   NUMVALUE                              :    REAL;
  79.  
  80.   LABELLENGTH, DATALEN, DATAFORM,
  81.   LABELPOSN, DATAPOSN, ROW, COLUMN      :    ARRAY[1..32] OF INTEGER;
  82.  
  83.   LABELLENGTH2, DATALEN2, DATAFORM2,
  84.   LABELPOSN2, DATAPOSN2, ROW2,
  85.   COLUMN2, TRANSARRAY                   :    ARRAY[1..32] OF INTEGER;
  86.  
  87.   KEYFIELD                              :    ARRAY[0..10] OF INTEGER;
  88.   LBL,LBL2                              :    ARRAY[1..384] OF CHAR;
  89.   GETDATA                               :    RANGE;  { FOR SOURCE FILE }
  90.   GETDATA2                              :    RANGE;  { FOR DESTINATION FILE }
  91.  
  92.   SOURCE                                :    FILE;
  93.   DESTINATION                           :    FILE;
  94.  
  95.  
  96. {================================================================}
  97. {        BINARY CODED DECIMAL TO INTEGER FUNCTION                }
  98. {================================================================}
  99. FUNCTION BCDTOIN (CHA : CHAR) : INTEGER;
  100. BEGIN
  101.   BCDTOIN := ORD(CHA) - TRUNC(ORD(CHA)/16)*6;
  102. END;
  103. {================================================================}
  104. {             CHARACTER TO INTEGER FUNCTION                      }
  105. {================================================================}
  106. FUNCTION CHTOIN(VAR CHARRAY : RANGE; START, LEN : INTEGER)  : INTEGER;
  107. VAR
  108.   CODE, RESULT : INTEGER;
  109.   WORKSTRING   : STRING[10];
  110. BEGIN
  111.   WORKSTRING := '';
  112.   FOR RESULT := 0 TO LEN-1  DO
  113.     BEGIN
  114.       IF CHARRAY[START + RESULT ] = ' ' THEN
  115.         WORKSTRING := WORKSTRING + '0'
  116.       ELSE WORKSTRING := WORKSTRING + CHARRAY[START+RESULT];
  117.     END;
  118.   VAL(WORKSTRING,RESULT,CODE);
  119.   CHTOIN := RESULT;
  120. END;
  121. {================================================================}
  122. {               TIDE (EDIT BACKWARDS) PROCEDURE                  }
  123. {================================================================}
  124. PROCEDURE TIDE( VAR MESSAGE : STRING60);
  125. VAR W  :  INTEGER;
  126. BEGIN
  127.   FOR W := LENGTH(MESSAGE) DOWNTO 1 DO
  128.     BEGIN
  129.       IF MESSAGE[W] IN [',', '$', '+'] THEN
  130.         BEGIN
  131.           DELETE(MESSAGE,W,1);
  132.           MESSAGE := ' ' + MESSAGE;
  133.         END;
  134.     END;
  135. END;
  136. {===============================================================}
  137. {                      FUNCTION EDITNBR                         }
  138. {===============================================================}
  139. FUNCTION EDITNBR(X: REAL; Y,Z: INTEGER; DOLLAR: CHAR ) : STRING20;
  140. VAR
  141.   NUMSTRING : STRING[24];
  142. BEGIN    { CONVERT THE REAL NUMBER TO A STRING VALUE }
  143.   STR(X:18:Z,NUMSTRING);
  144.   IF Z = 0 THEN Z := 16  { FIRST POSSIBLE COMMA LOCATION  }
  145.   ELSE Z := POS('.',NUMSTRING)-3;  {    DITTO             }
  146.  
  147.   WHILE Z > 1 DO  {  INSERT COMMAS/SPACES IN THE NUMBER  }
  148.     BEGIN
  149.       IF NUMSTRING[Z-1] IN [' ','-'] THEN
  150.         INSERT(' ',NUMSTRING,Z)
  151.       ELSE INSERT(',',NUMSTRING,Z);
  152.       Z := Z -3 ;  {  COMMAS OCCUR EVERY THIRD CHARACTER  }
  153.     END;
  154.  
  155.   {  FIND THE FIRST NON SPACE CHARACTER IN THE NUMBER }
  156.   Z := 0;
  157.   REPEAT
  158.     Z := Z + 1;
  159.  UNTIL NUMSTRING[Z] <> ' ';
  160.  
  161.   { DELETE ANY SPACE FOLLOWING A MINUS SIGN }
  162.   IF NUMSTRING[Z] = '-' THEN
  163.     BEGIN
  164.       IF NUMSTRING[Z+1] = ' ' THEN DELETE(NUMSTRING,Z+1,1);
  165.       IF DOLLAR = '$' THEN INSERT('$',NUMSTRING,Z+1);
  166.     END
  167.  
  168.   { ADD THE $/SPACE CHARACTER TO THE BEGINNING OF THE NUMBER }
  169.   ELSE NUMSTRING[Z-1] := DOLLAR;
  170.  
  171.   { REPLACE THE NUMBER WITH A FIELD OF '<' IF IT IS TOO BIG  }
  172.   Z := LENGTH(NUMSTRING)-Y;
  173.   IF NUMSTRING[Z-1] = '-' THEN
  174.       FOR Z := Y DOWNTO 0 DO NUMSTRING[Z] := '<'
  175.   ELSE
  176.     BEGIN
  177.       IF NUMSTRING[Z] IN ['0'..'9',',','-','.'] THEN
  178.           FOR Z := Y DOWNTO 0 DO NUMSTRING[Z] := '<';
  179.     END;
  180.   EDITNBR := COPY(NUMSTRING,Z+1,Y);
  181.  
  182. END;
  183. {================================================================}
  184. {               STRING TO REAL NUMBER PROCEDURE                  }
  185. {================================================================}
  186. PROCEDURE STRINGTOREAL(VAR SOURCE:STRING60;VAR NUMB:REAL;VAR CODE:INTEGER);
  187. VAR
  188.   W  :  INTEGER;
  189.   CONDITION  :  BOOLEAN;
  190. BEGIN
  191.   W := 1;
  192.   NUMB := 0;
  193.   CONDITION := TRUE;
  194.   TIDE(SOURCE); { ELIMINATE PUNCTUATION }
  195.   REPEAT  { UNTIL CONDITION = FALSE }
  196.     IF SOURCE[W] = ' ' THEN DELETE(SOURCE,1,1)
  197.     ELSE CONDITION := FALSE;
  198.     IF LENGTH(SOURCE) = 0 THEN
  199.       BEGIN
  200.         SOURCE := '0';
  201.         CONDITION := FALSE;
  202.       END;
  203.   UNTIL CONDITION = FALSE;
  204.   IF LENGTH(SOURCE) = 1 THEN CONDITION := TRUE;
  205.   WHILE CONDITION = FALSE DO
  206.     BEGIN
  207.       IF SOURCE[W] = ' ' THEN
  208.         BEGIN
  209.           CONDITION := TRUE;
  210.           W := W-2;
  211.         END;
  212.       IF LENGTH(SOURCE) = W THEN
  213.         BEGIN
  214.           CONDITION := TRUE;
  215.           W := W-1;
  216.         END;
  217.       W := W + 1;
  218.     END;
  219.   SOURCE := COPY(SOURCE,1,W);
  220.   VAL( SOURCE,NUMB,CODE );
  221. END;
  222. {================================================================}
  223. {           CALCULATE DISKRECORD & PRECBYTE PROCEDURE            }
  224. {================================================================}
  225. PROCEDURE CALCULATE;
  226.   BEGIN
  227.     DISKRECORD := TRUNC((DATARECORD-1)/BLOCKINGFACTOR)*2+7;
  228.     PRECBYTE := ((DATARECORD-1) MOD BLOCKINGFACTOR)*RCDLEN;
  229.   END;
  230. {================================================================}
  231. {                   GET DATA RECORD PROCEDURE                    }
  232. {================================================================}
  233. PROCEDURE GETDATAREC;
  234.   BEGIN
  235.     CALCULATE;
  236.     IF DISKRECORD <> DISKRECNOWINMEM THEN
  237.       BEGIN
  238.         IF FILERECCHGD = TRUE THEN
  239.           BEGIN
  240.             IF DISKRECNOWINMEM > NBRDISKRECUSED THEN
  241.               BEGIN                 { GET NEXT AVAILABLE RECORD }
  242.                 SEEK(SOURCE,NBRDISKRECUSED+2);
  243.                 NBRDISKRECUSED := DISKRECNOWINMEM;
  244.               END
  245.             ELSE
  246.               BEGIN
  247.                 SEEK(SOURCE,DISKRECNOWINMEM);
  248.               END;
  249.             BLOCKWRITE(SOURCE,GETDATA,2);  {SAVE CHANGED DATA}
  250.             FILERECCHGD := FALSE;
  251.           END;
  252.         IF DISKRECORD <= NBRDISKRECUSED THEN
  253.           BEGIN
  254.             SEEK(SOURCE,DISKRECORD);
  255.             BLOCKREAD(SOURCE,GETDATA,2);         {  RECORD DATA  }
  256.           END
  257.         ELSE FILLCHAR(GETDATA[1],256,' '); {SPACES FOR EMPTY REC }
  258.         DISKRECNOWINMEM := DISKRECORD;
  259.       END;
  260.   END;
  261. {================================================================}
  262. {     CALCULATE DESTINATION DISKRECORD & PRECBYTE PROCEDURE      }
  263. {================================================================}
  264. PROCEDURE CALCULATE2;
  265.   BEGIN
  266.     DISKRECORD2 := TRUNC((DATARECORD2-1)/BLOCKINGFACTOR2)*2+7;
  267.     PRECBYTE2 := ((DATARECORD2-1) MOD BLOCKINGFACTOR2)*RCDLEN2;
  268.   END;
  269. {================================================================}
  270. {            GET DESTINATION DATA RECORD PROCEDURE               }
  271. {================================================================}
  272. PROCEDURE GETDATAREC2;
  273.   BEGIN
  274.     CALCULATE2;
  275.     IF DISKRECORD2 <> DISKRECNOWINMEM2 THEN
  276.       BEGIN
  277.         IF FILERECCHGD2 = TRUE THEN
  278.           BEGIN
  279.             IF DISKRECNOWINMEM2 > NBRDISKRECUSED2 THEN
  280.               BEGIN                 { GET NEXT AVAILABLE RECORD }
  281.                 SEEK(DESTINATION,NBRDISKRECUSED2+2);
  282.                 NBRDISKRECUSED2 := DISKRECNOWINMEM2;
  283.               END
  284.             ELSE
  285.               BEGIN
  286.                 SEEK(DESTINATION,DISKRECNOWINMEM2);
  287.               END;
  288.             BLOCKWRITE(DESTINATION,GETDATA2,2);  {SAVE CHANGED DATA}
  289.             FILERECCHGD2 := FALSE;
  290.           END;
  291.         IF DISKRECORD2 <= NBRDISKRECUSED2 THEN
  292.           BEGIN
  293.             SEEK(DESTINATION,DISKRECORD2);
  294.             BLOCKREAD(DESTINATION,GETDATA2,2);         {  RECORD DATA  }
  295.           END
  296.         ELSE FILLCHAR(GETDATA2[1],256,' '); {SPACES FOR EMPTY REC }
  297.         DISKRECNOWINMEM2 := DISKRECORD2;
  298.       END;
  299.   END;
  300. {================================================================}
  301. {               GET DATA FROM ARRAY PROCEDURE                    }
  302. {================================================================}
  303. PROCEDURE GETDATAFROMARRAY(VAR MESSAGE : STRING60; Z : INTEGER);
  304. VAR W :  INTEGER;
  305. BEGIN
  306.   MESSAGE := '';
  307.   FOR W := PRECBYTE+DATAPOSN[Z] TO PRECBYTE+DATAPOSN[Z+1]-1 DO
  308.     MESSAGE := MESSAGE + GETDATA[W];
  309. END;
  310. {================================================================}
  311. {                 PRINT LABEL AND FIELD NUMBER                   }
  312. {================================================================}
  313. PROCEDURE PRINTLABFLDNBR( Z: INTEGER);
  314. VAR
  315.   W      :  INTEGER;
  316. BEGIN
  317.   IF ROW[Z] <22 THEN
  318.     BEGIN
  319.       GOTOXY(COLUMN[Z],ROW[Z]);
  320.       FOR W := LABELPOSN[Z] TO LABELPOSN[Z+1]-1 DO
  321.       WRITE (LBL[W]);
  322.       WRITE('= ',Z);
  323.     END;
  324. END;
  325. {================================================================}
  326. {                      PRINT LABEL                               }
  327. {================================================================}
  328. PROCEDURE PRINTLABEL( Z: INTEGER);
  329. VAR
  330.   W      :  INTEGER;
  331. BEGIN
  332.   WRITE(Z,' : ');
  333.   FOR W := LABELPOSN[Z] TO LABELPOSN[Z+1]-1 DO
  334.   WRITE (LBL[W]);
  335.   WRITELN;
  336. END;
  337. {================================================================}
  338. {              DISPLAY ONE RECORD PROCEDURE, SOURCE              }
  339. {================================================================}
  340. PROCEDURE DISPLAYREC;
  341. BEGIN
  342.   CLRSCR;
  343.   FOR Z := 1 TO FIELDPERRECORD DO
  344.   PRINTLABFLDNBR(Z);
  345.   GOTOXY(70,23);
  346.   WRITE('RECORD ',DATARECORD);
  347.   LASTRECUSED := DATARECORD;
  348. END;
  349.  
  350. {================================================================}
  351. {               GET DATA FROM ARRAY2 PROCEDURE                   }
  352. {================================================================}
  353. PROCEDURE GETDATAFROMARRAY2(VAR MESSAGE : STRING60; Z : INTEGER);
  354. VAR W :  INTEGER;
  355. BEGIN
  356.   MESSAGE := '';
  357.   FOR W := PRECBYTE2+DATAPOSN2[Z] TO PRECBYTE2+DATAPOSN2[Z+1]-1 DO
  358.     MESSAGE := MESSAGE + GETDATA2[W];
  359. END;
  360. {================================================================}
  361. {        PRINT DESTINATION LABEL AND FIELD NUMBER                }
  362. {================================================================}
  363. PROCEDURE PRINTLABFLDNBR2( Z: INTEGER);
  364. VAR
  365.   W      :  INTEGER;
  366. BEGIN
  367.   IF ROW2[Z] <22 THEN
  368.     BEGIN
  369.       GOTOXY(COLUMN2[Z],ROW2[Z]);
  370.       FOR W := LABELPOSN2[Z] TO LABELPOSN2[Z+1]-1 DO
  371.       WRITE (LBL2[W]);
  372.       WRITE('= ',Z);
  373.     END;
  374. END;
  375. {================================================================}
  376. {                PRINT DESTINATION LABEL                         }
  377. {================================================================}
  378. PROCEDURE PRINTLABEL2( Z: INTEGER);
  379. VAR
  380.   W      :  INTEGER;
  381. BEGIN
  382.   WRITE(Z,' : ');
  383.   FOR W := LABELPOSN2[Z] TO LABELPOSN2[Z+1]-1 DO
  384.   WRITE (LBL2[W]);
  385.   WRITELN;
  386. END;
  387. {================================================================}
  388. {           DISPLAY ONE RECORD PROCEDURE, DESTINATION            }
  389. {================================================================}
  390. PROCEDURE DISPLAYREC2;
  391. BEGIN
  392.   CLRSCR;
  393.   FOR Z := 1 TO FIELDPERRECORD2 DO
  394.   PRINTLABFLDNBR2(Z);
  395.   GOTOXY(70,23);
  396.   WRITE('RECORD ',DATARECORD2);
  397.   LASTRECUSED2 := DATARECORD2;
  398. END;
  399. {===============================================================}
  400. {                       FUNCTION EXIST                          }
  401. {===============================================================}
  402. FUNCTION EXIST(FILENAME : NAMESTR) : BOOLEAN;
  403. VAR
  404.   FIL :  FILE;
  405. BEGIN
  406.   ASSIGN(FIL,FILENAME);
  407.   {$I-}
  408.   RESET(FIL);
  409.   {$I+}
  410.   EXIST := (IORESULT = 0)
  411. END;
  412. {================================================================}
  413. {           FUNCTION GET NUMBER IN GETDATA FIELD ( Z )           }
  414. {================================================================}
  415. FUNCTION FNBRINFLD(Z : INTEGER) : REAL;
  416. VAR
  417.   REALVAL : REAL;
  418.   BEGIN
  419.     GETDATAFROMARRAY(ANS,Z);
  420.     IF DATAFORM[Z] <> ASCII THEN
  421.       STRINGTOREAL(ANS,REALVAL,CODE)
  422.     ELSE REALVAL := 0;
  423.     FNBRINFLD := REALVAL;
  424.   END;
  425. {$ITRANSFR1.PAS}
  426.