PROGRAM tstindex;
{
Programm for testing the external routines index0 and index1
}
      TYPE
            key_t = ARRAY[1..256] of CHAR;
            rec_t = ARRAY[1..2048] of CHAR;
            ctrl_rec = RECORD
                  c_1 : ARRAY[1..4] of INTEGER;
                  rec_size : INTEGER;
                  c_2 : INTEGER;
                  key_size : INTEGER;
                  end;
            index_record = RECORD
                  disk : CHAR;
                  filename : ARRAY[1..8] of CHAR;
                  return_code : INTEGER;
                  res_1 : INTEGER;
                  ctrl : ^ctrl_rec;
                  reserved : ARRAY[1..196] of CHAR;
                  END;

      VAR
            key : key_t;
            rec : rec_t;
            cmd : CHAR;
            ir  : index_record;
            tem_d : ARRAY[1..2048] of CHAR;

      PROCEDURE INDEX0 ( command : CHAR;
                  var key : key_t;
                  var rec : rec_t;
                  var ir : index_record ); extern;

      PROCEDURE INDEX1 ( command : CHAR;
                  var key : key_t;
                  var rec : rec_t;
                  var ir : index_record ); extern;

      BEGIN       (* tstindex *)
      ir := ' ';
      write('Disk: ');
      readln(ir.disk);
      write('File: ');
      readln(ir.filename);
      REPEAT
            write('cmd: ');
            readln(cmd);
            cmd := upcase(cmd);
            key := ' ';
            rec := ' ';
            IF (cmd in ['A', 'D', 'R', 'U']) THEN
                  BEGIN
                  write('key: ');
                  readln(key);
                  IF (cmd in ['A', 'U']) THEN
                        BEGIN
                        write('data: ');
                        readln(tem_d);
                        rec := copy(key, 1, ir.ctrl^.key_size) +
                               copy(tem_d, 1, ir.ctrl^.rec_size -
                                    ir.ctrl^.key_size);
                        END;
                  END;
            (* justify or kompress must call INDEX1 *)
            IF (cmd in ['J', 'K']) THEN
                  BEGIN
                  rec := ' ';
                  INDEX1(cmd, key, rec, ir);
                  END
            ELSE
                  INDEX0(cmd, key, rec, ir);
            IF (ir.return_code <> 0) THEN
                  BEGIN
                  writeln('Error:', ir.return_code);
                  END;
            IF (cmd = 'Q') THEN
                  writeln('query result: ',key[1]);
            IF (cmd in ['B', 'R', 'S']) THEN
                  BEGIN
                  writeln('key: ', copy(rec, 1, ir.ctrl^.key_size));
                  writeln('data: ', copy(rec, ir.ctrl^.key_size + 1,
                          ir.ctrl^.rec_size - ir.ctrl^.key_size));
                  END;
            UNTIL (cmd = '?');
      END.        (* tstindex *)
