OVERLAY PROCEDURE RAWDATA_INPUT;

    { Menu to get the beginning and ending columns for the tracking data.
      The first record of the output file will indicate that this is
      a structured data file. The output file will be used as input for
      all other programs on the main menu. }

    TYPE
      DATA_POINTER = ^DATA_RECORD;
      DATA_RECORD  = RECORD
                     X          : REAL;
                     Y          : REAL;
                     Z          : REAL;
                     DATEV      : DATETYPE;
                     TIMEV      : DATETYPE;
                     HOURV      : INTEGER;
                     LOCATION   : INTEGER;
                     ACTIVITY   : INTEGER;
                     SUBJECT_NO : INTEGER;
                     RECORD_NO  : INTEGER;
                     SEX        : CHAR;
                     NEXT       : DATA_POINTER;
                     END;

      VAR
        FIRST_RECORD  : DATA_POINTER;
        LAST_RECORD   : DATA_POINTER;
        NEW_RECORD    : DATA_POINTER;

    PROCEDURE INIT_DATA_POINTER;

      { PROCEDURE TO ZERO OUT THE VALUES IN THE DATA RECORD POINTER }

      BEGIN  { INIT_DATA_POINTER PROCEDURE }
        WITH NEW_RECORD^ DO
          BEGIN
            X          := 0.0;
            Y          := 0.0;
            Z          := 0.0;
            DATEV      := ' ';
            TIMEV      := ' ';
            HOURV      := 0;
            LOCATION   := 0;
            ACTIVITY   := 0;
            SUBJECT_NO := 0;
            RECORD_NO  := 0;
            SEX        := ' ';
            NEXT       := NIL;
          END;

      END;  { INIT_DATA_POINTER PROCEDURE }

    PROCEDURE INIT_RADIOREC;

      { PROCEDURE TO ZERO OUT THE VALUES IN THE RADIOREC RECORD }

      BEGIN  { INIT_RADIOREC PROCEDURE }
        WITH FILE2REC DO
          BEGIN
            X          := 0.0;
            Y          := 0.0;
            Z          := 0.0;
            DATEV      := ' ';
            TIMEV      := ' ';
            HOURV      := 0;
            LOCATION   := 0;
            ACTIVITY   := 0;
            SUBJECT_NO := 0;
            RECORD_NO  := 0;
            SEX        := ' ';
          END;

      END;  { INIT_RADIOREC PROCEDURE }

    PROCEDURE FILE_CONVERT;

      { A sub-procedure to convert the raw data file into the structured data
        file. There is quite a bit of error checking in this portion. }

      VAR
        ACTLEN     : INTEGER;     { LENGTH OF THE ACTIVITY COLUMNS }
        DATELEN    : INTEGER;     { LENGTH OF THE DATE COLUMNS }
        ERRCODE    : INTEGER;     { ERROR CODE OF CONVERSION }
        GOODPT     : INTEGER;     { NUMBER OF UNREJECTED POINTS }
        HOURLEN    : INTEGER;     { LENGTH OF THE HOUR COLUMNS }
        LOCLEN     : INTEGER;     { LENGTH OF THE LOCATION COLUMNS }
        NPOINT     : INTEGER;     { NUMBER OF OBSERVATIONS IN THE FILE }
        RECLEN     : INTEGER;     { LENGTH OF THE RECORD NO. COLUMNS }
        SEXLEN     : INTEGER;     { LENGTH OF THE SEX COLUMNS }
        SUBLEN     : INTEGER;     { LENGTH OF THE SUBJECT NO. COLUMNS }
        TIMELEN    : INTEGER;     { LENGTH OF THE TIME COLUMNS }
        XLEN       : INTEGER;     { LENGTH OF THE X COLUMNS }
        YLEN       : INTEGER;     { LENGTH OF THE Y COLUMNS }
        ZLEN       : INTEGER;     { LENGTH OF THE Z COLUMNS }

      PROCEDURE DUMP_RADIO_RECORDS;

        { PROCEDURE TO DUMP THE HEAP RECORDS INTO THE FILEVAR2 FILE }

        BEGIN  { DUMP_RADIO_RECORDS PROCEDURE }
          NEW_RECORD := FIRST_RECORD;
          WHILE NEW_RECORD <> NIL DO
            BEGIN
              FILE2REC.X          := NEW_RECORD^.X;
              FILE2REC.Y          := NEW_RECORD^.Y;
              FILE2REC.Z          := NEW_RECORD^.Z;
              FILE2REC.DATEV      := NEW_RECORD^.DATEV;
              FILE2REC.TIMEV      := NEW_RECORD^.TIMEV;
              FILE2REC.HOURV      := NEW_RECORD^.HOURV;
              FILE2REC.LOCATION   := NEW_RECORD^.LOCATION;
              FILE2REC.ACTIVITY   := NEW_RECORD^.ACTIVITY;
              FILE2REC.SUBJECT_NO := NEW_RECORD^.SUBJECT_NO;
              FILE2REC.RECORD_NO  := NEW_RECORD^.RECORD_NO;
              FILE2REC.SEX        := NEW_RECORD^.SEX;
              GOODPT := GOODPT + 1;
              WRITE (FILEVAR2,FILE2REC);
              NEW_RECORD := NEW_RECORD^.NEXT;
            END;  { WHILE NEW RECORD <> NIL }

          RELEASE(HEAP_TOP);
          FIRST_RECORD := NIL;

        END;   { DUMP_RADIO_RECORDS PROCEDURE }

      BEGIN  { FILE_CONVERT PROCEDURE }

        { Open and set the files }

        ASSIGN  (FILEVAR1,FILEIN);
        RESET   (FILEVAR1);            { POSITION POINTER TO BEGINNING OF FILE }
        ASSIGN  (FILEVAR2,FILEOUT);
        REWRITE (FILEVAR2);            { ERASE ANY PREVIOUS FILE }

        { CALCULATE THE LENGTHS OF THE VARIOUS VALUES }

        ACTLEN  := ACTEND - ACTBEGIN + 1;
        DATELEN := DATEEND - DATEBEGIN + 1;
        HOURLEN := HOUREND - HOURBEGIN + 1;
        LOCLEN  := LOCEND - LOCBEGIN + 1;
        RECLEN  := RECEND - RECBEGIN + 1;
        SEXLEN  := SEXEND - SEXBEGIN + 1;
        SUBLEN  := SUBNOEND - SUBNOBEGIN + 1;
        TIMELEN := TIMEEND - TIMEBEGIN + 1;
        XLEN    := XEND - XBEGIN + 1;
        YLEN    := YEND - YBEGIN + 1;
        ZLEN    := ZEND - ZBEGIN + 1;
        NPOINT  := 0;
        GOODPT  := 0;
        XHIGH   := 0;
        XLOW    := 0;
        YHIGH   := 0;
        YLOW    := 0;
        ZHIGH   := 0;
        ZLOW    := 0;

        { Place three blank records at the beginning of the output file. These
          records are used to identify the type of file and the max and min
          values of x, y, and z. }

        INIT_RADIOREC;
        WRITE (FILEVAR2,FILE2REC);     { THE FIRST THREE RECORDS GIVE THE FILE TYPE }
        WRITE (FILEVAR2,FILE2REC);     { AND THE SPECS ON X,Y,Z AND NUM POINTS }
        WRITE (FILEVAR2,FILE2REC);

        { CONVERT THE INPUT VALUES ANS WRITE THEM TO MEMORY }

        MARK(HEAP_TOP);
        FIRST_RECORD := NIL;
        GOODRECORD   := TRUE;
        LINE_OUT(1,23,'Processing Number:');
        LINE_OUT(37,19,'Memory left:            paragraphs.');

        WHILE (NOT EOF(FILEVAR1)) AND (KEEP_GOING) DO
          BEGIN
            IF GOODRECORD = TRUE
              THEN NEW(NEW_RECORD)
              ELSE GOODRECORD := TRUE;
            READLN (FILEVAR1,LINE1);
            NPOINT := NPOINT + 1;
            GOTOXY(20,23);
            WRITE (NPOINT:5);
            INIT_DATA_POINTER;
            WITH NEW_RECORD^ DO
              BEGIN
                { FIRST, SET ALL VALUES TO BLANK OR ZERO }
                IF XBEGIN > 0 THEN CON_VERT_R(XBEGIN,XLEN,NPOINT,X);
                IF (YBEGIN > 0) AND (GOODRECORD)
                  THEN CON_VERT_R(YBEGIN,YLEN,NPOINT,Y);
                IF (ZBEGIN > 0) AND (GOODRECORD)
                  THEN CON_VERT_R(ZBEGIN,ZLEN,NPOINT,Z);
                IF (HOURBEGIN > 0) AND (GOODRECORD)
                  THEN CON_VERT_I(HOURBEGIN,HOURLEN,NPOINT,HOURV);
                IF (LOCBEGIN > 0) AND (GOODRECORD)
                  THEN CON_VERT_I(LOCBEGIN,LOCLEN,NPOINT,LOCATION);
                IF (ACTBEGIN > 0) AND (GOODRECORD)
                  THEN CON_VERT_I(ACTBEGIN,ACTLEN,NPOINT,ACTIVITY);
                IF (SUBNOBEGIN > 0) AND (GOODRECORD)
                  THEN CON_VERT_I(SUBNOBEGIN,SUBLEN,NPOINT,SUBJECT_NO);
                IF (RECBEGIN > 0) AND (GOODRECORD)
                  THEN CON_VERT_I(RECBEGIN,RECLEN,NPOINT,RECORD_NO);
                IF DATEBEGIN > 0 THEN
                  DATEV := COPY(LINE1,DATEBEGIN,DATELEN);
                IF TIMEBEGIN > 0 THEN
                  TIMEV := COPY(LINE1,TIMEBEGIN,TIMELEN);
                IF SEXBEGIN > 0 THEN
                  SEX   := COPY(LINE1,SEXBEGIN,SEXLEN);
                IF GOODRECORD THEN
                  IF ( X > 0.0 ) AND ( X < 0.0001 ) THEN
                    IF ( Y > 0.0 ) AND ( Y < 0.0001 ) THEN
                      BEGIN
                        GOTOXY(1,23);
                        WRITE (SPACE30);
                        GOTOXY(1,23);
                        WRITELN ('Warning... X and Y values are too small use in further programs');
                        WRITE   ('      X  AND  Y ',X,' ',Y,' ');
                        KEYBOARD_PAUSE;
                      END;

                { GET MAX AND MIN VALUES }

                IF NOT GOODRECORD THEN
                  LINE_OUT(1,23,'Processing Number:');

                IF GOODRECORD THEN
                BEGIN
                IF (NPOINT = 1) OR (X < XLOW)  THEN XLOW  := X;
                IF (NPOINT = 1) OR (X > XHIGH) THEN XHIGH := X;
                IF (NPOINT = 1) OR (Y < YLOW)  THEN YLOW  := Y;
                IF (NPOINT = 1) OR (Y > YHIGH) THEN YHIGH := Y;
                IF (NPOINT = 1) OR (Z < ZLOW)  THEN ZLOW  := Z;
                IF (NPOINT = 1) OR (Z > ZHIGH) THEN ZHIGH := Z;
                END;  { IF GOODRECORD }

              END; { WITH NEW_RECORD^ DO }

            { IF THE RECORD IS GOOD, ADD IT TO THE CHAIN }

            IF GOODRECORD THEN
              BEGIN
                IF FIRST_RECORD = NIL
                  THEN FIRST_RECORD      := NEW_RECORD
                  ELSE LAST_RECORD^.NEXT := NEW_RECORD;
                LAST_RECORD := NEW_RECORD;
                LAST_RECORD^.NEXT := NIL;
              END;

            { SEE IF MEMORY IS RUNNING OUT }

            GOTOXY(50,19);
            WRITE (MEMORY_LEFT:8:2);

            IF MEMORY_LEFT < 300 THEN DUMP_RADIO_RECORDS;

          END; { WHILE NOT EOF(FILEVAR1) }

        { END OF INPUT FILE, NOW WRITE OUT ANY RECORDS LEFT IN MEMORY }

        IF KEEP_GOING THEN
        BEGIN

        IF FIRST_RECORD <> NIL THEN DUMP_RADIO_RECORDS;

        { WRITE OUT THE FILE ID AND THE EXTREME VALUES }

        SEEK(FILEVAR2,0);
        INIT_RADIOREC;
        WITH FILE2REC DO
          BEGIN
            X := -1;              { Identify a formatted data file with }
            Y := -2;              { -1, -2, -3. The sex = g is version 1.1 }
            Z := -3;
            SEX := 'G';
          END;
        WRITE (FILEVAR2,FILE2REC);
        INIT_RADIOREC;
        WITH FILE2REC DO
          BEGIN
            X := XLOW;
            Y := YLOW;
            Z := ZLOW;
            RECORD_NO := GOODPT;
          END;
        WRITE (FILEVAR2,FILE2REC);
        INIT_RADIOREC;
        WITH FILE2REC DO
          BEGIN
            X := XHIGH;
            Y := YHIGH;
            Z := ZHIGH;
          END;
        WRITE (FILEVAR2,FILE2REC);

        GOTOXY(1,24);
        WRITE ('Formatting of the data file complete. There are ',GOODPT:5,' valid locations.');

        END;  { IF KEEP_GOING }
        { CLOSE ALL THE FILES }

        CLOSE (FILEVAR1);
        CLOSE (FILEVAR2);
        RELEASE(HEAP_TOP);

      END;  { FILE_CONVERT PROCEDURE }


    BEGIN  { RAWDATA_INPUT PROCEDURE }

      { First, draw out the labels. Then change color for the input. }

      CLRSCR;
      DISPLAY_COLOR(CYAN);

      LINE_OUT(18,2,'(2) Format ASCII File with Location Coordinates');
      LINE_OUT(7,4,'1  Input File:');
      LINE_OUT(38,4,'2  Output File:');
      LINE_OUT(16,6,'First Column  Last Column');
      LINE_OUT(7,8,'3  X:');
      LINE_OUT(7,10,'4  Y:');

      DISPLAY_COLOR(RED);

      LINE_OUT(7,21,'P  Process Data');
      LINE_OUT(37,21,'E  Exit to Main Menu');



      TEXTCOLOR(YELLOW);
      LINE_OUT(22,4,FILEIN);
      LINE_OUT(54,4,FILEOUT);
      INT_OUT(17,8,XBEGIN,XEND);
      INT_OUT(17,10,YBEGIN,YEND);
      { INT_OUT(17,12,ZBEGIN,ZEND);     }
      { INT_OUT(17,14,DATEBEGIN,DATEEND);  }
      { INT_OUT(17,16,TIMEBEGIN,TIMEEND);  }
      { INT_OUT(17,18,HOURBEGIN,HOUREND);  }
      { INT_OUT(53,8,SUBNOBEGIN,SUBNOEND); }
      { INT_OUT(53,10,SEXBEGIN,SEXEND); }
      { INT_OUT(53,12,ACTBEGIN,ACTEND); }
      { INT_OUT(53,14,LOCBEGIN,LOCEND); }
      { INT_OUT(53,16,RECBEGIN,RECEND); }


      GOTOXY(1,24);
      KEYVALUE := ' ';
      WHILE UPCASE(KEYVALUE) <> 'E' DO
        BEGIN

          KEYVALUE := ' ';

          WHILE NOT (UPCASE(KEYVALUE) IN ['1'..'E','P']) DO
            READ (KBD,KEYVALUE);
          KEYVALUE := UPCASE(KEYVALUE);

          GOTOXY(1,23);
          DELLINE;
          DELLINE;

          CASE KEYVALUE OF
            '1': BEGIN
                 LINE_OUT(1,23,'Enter the name of the ASCII data INPUT file  ');
                 READLN (INPUT,FILEIN);
                 GOTOXY(1,23);
                 DELLINE;
                 CAPIT(FILEIN);
                 LINE_OUT(22,4,SPACE12);
                 LINE_OUT(22,4,FILEIN);
                 END;
            '2': BEGIN
                 LINE_OUT(1,23,'Enter the name of the structured OUTPUT data file  ');
                 READLN (INPUT,FILEOUT);
                 GOTOXY(1,23);
                 DELLINE;
                 CAPIT(FILEOUT);
                 LINE_OUT(54,4,SPACE12);
                 LINE_OUT(54,4,FILEOUT);
                 END;
            '3': QUESTION(17,8,'X',XBEGIN,XEND);
            '4': QUESTION(17,10,'Y',YBEGIN,YEND);
            '5': QUESTION(17,12,'Z',ZBEGIN,ZEND);
            '6': QUESTION(17,14,'DATE',DATEBEGIN,DATEEND);
            '7': QUESTION(17,16,'TIME',TIMEBEGIN,TIMEEND);
            '8': QUESTION(17,18,'HOUR',HOURBEGIN,HOUREND);
            '9': QUESTION(53,8,'SUBJECT NO.',SUBNOBEGIN,SUBNOEND);
            'A': QUESTION(53,10,'SUBJECT SEX',SEXBEGIN,SEXEND);
            'B': QUESTION(53,12,'ACTIVITY',ACTBEGIN,ACTEND);
            'C': QUESTION(53,14,'LOCATION',LOCBEGIN,LOCEND);
            'D': QUESTION(53,16,'RECORD NUMBER',RECBEGIN,RECEND);
            'P': BEGIN
                 KEEP_GOING := TRUE;

                 IF (FILEIN = '') OR (FILEOUT = '' ) THEN
                   BEGIN
                     LINE_OUT(1,23,'Both files must be defined.');
                     KEEP_GOING := FALSE;
                   END;

                 IF (KEEP_GOING) AND (NOT EXIST(FILEIN)) THEN
                   BEGIN
                     LINE_OUT(1,23,'The input data file does not exist.');
                     KEEP_GOING := FALSE;
                   END;

                 IF KEEP_GOING THEN
                   IF ( XBEGIN = 0 ) OR ( XEND = 0 ) THEN
                     BEGIN
                       LINE_OUT(1,23,'Both the X and Y fields must have non-zero values.');
                       LINE_OUT(1,24,'The X columns are invalid.');
                       KEEP_GOING := FALSE;
                     END;

                 IF KEEP_GOING THEN
                   IF ( YBEGIN = 0 ) OR ( YEND = 0 ) THEN
                     BEGIN
                       LINE_OUT(1,23,'Both the X and Y fields must have non_zero values.');
                       LINE_OUT(1,24,'The Y columns are invalid.');
                       KEEP_GOING := FALSE;
                     END;

                 IF KEEP_GOING THEN FILE_CONVERT;

                 END; { CASE 'P' }

          END; { CASE KEYVALUE }

          GOTOXY(1,25);

        END; { WHILE KEYVALUE <> 'E' }

      KEYVALUE := ' ';

    END; { RAWDATA_INPUT PROCEDURE }

