{
  "disks": {
    "1": {
      "dirs": [
        {
          "path": "/",
          "files": [
            {
              "name": "DEMO",
              "dir": true,
              "date": "1993-06-15",
              "time": "11:14"
            },
            {
              "name": "LIBRARY",
              "dir": true,
              "date": "1993-06-15",
              "time": "11:14"
            },
            {
              "name": "PROGRAMS",
              "dir": true,
              "date": "1993-06-15",
              "time": "11:14"
            }
          ]
        },
        {
          "path": "/DEMO",
          "files": [
            {
              "name": "BLD2KEYS EXE",
              "size": 38933,
              "date": "1988-03-19",
              "time": "19:44"
            },
            {
              "name": "BTPARALL EXE",
              "size": 16193,
              "date": "1988-03-19",
              "time": "19:45"
            },
            {
              "name": "BTPARCON EXE",
              "size": 16049,
              "date": "1988-03-19",
              "time": "19:45"
            },
            {
              "name": "BTPARMS  BTR",
              "size": 170,
              "date": "1987-12-03",
              "time": "19:35"
            },
            {
              "name": "BTPARSE  EXE",
              "size": 16191,
              "date": "1988-03-19",
              "time": "19:45"
            },
            {
              "name": "BTSETUP  EXE",
              "size": 16103,
              "date": "1988-03-20",
              "time": "14:58"
            },
            {
              "name": "BTVARNME IDX",
              "size": 5632,
              "date": "1987-11-04",
              "time": "23:47"
            },
            {
              "name": "BTVARSSN IDX",
              "size": 3584,
              "date": "1987-11-04",
              "time": "23:47"
            },
            {
              "name": "CBTRSEQ  EXE",
              "size": 17649,
              "date": "1988-03-19",
              "time": "19:45"
            },
            {
              "name": "CHKBTREE EXE",
              "size": 17737,
              "date": "1988-03-19",
              "time": "19:45"
            },
            {
              "name": "CKERROR  MSG",
              "size": 3193,
              "date": "1987-12-03",
              "time": "18:30"
            },
            {
              "name": "LOOKHDR  EXE",
              "size": 11497,
              "date": "1988-03-19",
              "time": "19:46"
            },
            {
              "name": "MAKBTREE EXE",
              "size": 18799,
              "date": "1988-03-19",
              "time": "19:46"
            },
            {
              "name": "PATIENT  DAT",
              "size": 256,
              "date": "1988-06-07",
              "time": "15:01"
            },
            {
              "name": "PATIENT  IDX",
              "size": 9216,
              "date": "1988-06-07",
              "time": "15:01"
            },
            {
              "name": "PATIENT  RAW",
              "size": 19584,
              "date": "1987-11-04",
              "time": "23:22"
            },
            {
              "name": "PATIENT  VAR",
              "size": 8946,
              "date": "1987-11-04",
              "time": "23:47"
            },
            {
              "name": "PRNTKEYS EXE",
              "size": 15503,
              "date": "1988-03-19",
              "time": "19:46"
            },
            {
              "name": "TIMECB5  EXE",
              "size": 39063,
              "date": "1988-03-19",
              "time": "19:46"
            },
            {
              "name": "USERBTR  EXE",
              "size": 42507,
              "date": "1988-03-19",
              "time": "19:46"
            },
            {
              "name": "ZAPHDR   EXE",
              "size": 11947,
              "date": "1988-03-19",
              "time": "19:46"
            }
          ]
        },
        {
          "path": "/LIBRARY",
          "files": [
            {
              "name": "ADJSTACK C",
              "size": 2046,
              "date": "1987-11-05",
              "time": "0:27"
            },
            {
              "name": "ADJSTACK OBJ",
              "size": 722,
              "date": "1988-05-06",
              "time": "23:46"
            },
            {
              "name": "BLKSHFT  C",
              "size": 1278,
              "date": "1987-11-05",
              "time": "0:26"
            },
            {
              "name": "BLKSHFT  OBJ",
              "size": 393,
              "date": "1988-05-06",
              "time": "23:46"
            },
            {
              "name": "BTBINARY C",
              "size": 4402,
              "date": "1987-11-09",
              "time": "0:40"
            },
            {
              "name": "BTBINARY OBJ",
              "size": 1165,
              "date": "1988-05-06",
              "time": "23:46"
            },
            {
              "name": "BTCINIT  C",
              "size": 5362,
              "date": "1988-03-19",
              "time": "17:30"
            },
            {
              "name": "BTCINIT  OBJ",
              "size": 1434,
              "date": "1988-05-06",
              "time": "23:47"
            },
            {
              "name": "BTFIO    H",
              "size": 3893,
              "date": "1987-11-05",
              "time": "0:26"
            },
            {
              "name": "BTINSPLT C",
              "size": 2648,
              "date": "1987-12-02",
              "time": "14:06"
            },
            {
              "name": "BTINSPLT OBJ",
              "size": 760,
              "date": "1988-05-06",
              "time": "23:46"
            },
            {
              "name": "BTOPEN   C",
              "size": 1335,
              "date": "1987-11-05",
              "time": "0:26"
            },
            {
              "name": "BTOPEN   OBJ",
              "size": 311,
              "date": "1988-05-06",
              "time": "23:46"
            },
            {
              "name": "BTRDELET C",
              "size": 3486,
              "date": "1987-12-02",
              "time": "14:08"
            },
            {
              "name": "BTRDELET OBJ",
              "size": 3826,
              "date": "1988-05-06",
              "time": "23:47"
            },
            {
              "name": "BTRGETS  C",
              "size": 17280,
              "date": "1987-12-02",
              "time": "14:07"
            },
            {
              "name": "BTRGETS  OBJ",
              "size": 4324,
              "date": "1988-05-06",
              "time": "23:47"
            },
            {
              "name": "BTRINIT  C",
              "size": 3649,
              "date": "1988-03-19",
              "time": "19:03"
            },
            {
              "name": "BTRINIT  OBJ",
              "size": 890,
              "date": "1988-05-06",
              "time": "23:47"
            },
            {
              "name": "BTRISRT  C",
              "size": 8468,
              "date": "1988-03-14",
              "time": "16:21"
            },
            {
              "name": "BTRISRT  OBJ",
              "size": 2405,
              "date": "1988-05-06",
              "time": "23:47"
            },
            {
              "name": "BTVARLEN C",
              "size": 11937,
              "date": "1987-11-05",
              "time": "11:28"
            },
            {
              "name": "BTVARLEN OBJ",
              "size": 2283,
              "date": "1988-05-06",
              "time": "23:48"
            },
            {
              "name": "CBTRDEF  H",
              "size": 4045,
              "date": "1987-11-05",
              "time": "0:28"
            },
            {
              "name": "CBTREE   C",
              "size": 7864,
              "date": "1988-03-19",
              "time": "17:30"
            },
            {
              "name": "CBTREE   H",
              "size": 8004,
              "date": "1988-03-19",
              "time": "18:57"
            },
            {
              "name": "CBTREE   OBJ",
              "size": 2238,
              "date": "1988-05-06",
              "time": "23:48"
            },
            {
              "name": "CCLIBMS  BAT",
              "size": 1191,
              "date": "1988-03-14",
              "time": "17:10"
            },
            {
              "name": "CCLIBMS4 BAT",
              "size": 1191,
              "date": "1988-03-14",
              "time": "17:10"
            },
            {
              "name": "CCLIBMS5 BAT",
              "size": 572,
              "date": "1988-03-19",
              "time": "19:21"
            },
            {
              "name": "CKERROR  C",
              "size": 6446,
              "date": "1987-11-09",
              "time": "1:01"
            },
            {
              "name": "CKERROR  OBJ",
              "size": 2020,
              "date": "1988-05-06",
              "time": "23:48"
            },
            {
              "name": "CMPTNODE C",
              "size": 10244,
              "date": "1988-03-14",
              "time": "16:04"
            },
            {
              "name": "CPYLTBRO C",
              "size": 3777,
              "date": "1988-03-14",
              "time": "15:37"
            },
            {
              "name": "CPYLTBRO OBJ",
              "size": 1314,
              "date": "1988-05-06",
              "time": "23:48"
            },
            {
              "name": "CPYRTBRO C",
              "size": 4127,
              "date": "1988-03-14",
              "time": "15:36"
            },
            {
              "name": "CPYRTBRO OBJ",
              "size": 1339,
              "date": "1988-05-06",
              "time": "23:48"
            },
            {
              "name": "CREATBTR C",
              "size": 10568,
              "date": "1988-03-13",
              "time": "2:24"
            },
            {
              "name": "CREATBTR OBJ",
              "size": 2902,
              "date": "1988-05-06",
              "time": "23:49"
            },
            {
              "name": "DELAY    C",
              "size": 450,
              "date": "1987-11-05",
              "time": "0:27"
            },
            {
              "name": "DELAY    OBJ",
              "size": 329,
              "date": "1988-05-06",
              "time": "23:49"
            },
            {
              "name": "DELETBTR C",
              "size": 3277,
              "date": "1987-11-05",
              "time": "0:26"
            },
            {
              "name": "DELETBTR OBJ",
              "size": 941,
              "date": "1988-05-06",
              "time": "23:49"
            },
            {
              "name": "DELETEKY C",
              "size": 638,
              "date": "1987-11-08",
              "time": "17:01"
            },
            {
              "name": "DELETEKY OBJ",
              "size": 410,
              "date": "1988-05-06",
              "time": "23:49"
            },
            {
              "name": "DELETREC C",
              "size": 1192,
              "date": "1987-11-05",
              "time": "0:27"
            },
            {
              "name": "DELETREC OBJ",
              "size": 590,
              "date": "1988-05-06",
              "time": "23:49"
            },
            {
              "name": "DUMPM    C",
              "size": 1644,
              "date": "1987-11-05",
              "time": "0:26"
            },
            {
              "name": "FDGETS   C",
              "size": 1190,
              "date": "1987-11-05",
              "time": "0:26"
            },
            {
              "name": "FDGETS   OBJ",
              "size": 437,
              "date": "1988-05-06",
              "time": "23:49"
            },
            {
              "name": "FINDROOT C",
              "size": 1809,
              "date": "1987-11-05",
              "time": "0:26"
            },
            {
              "name": "FINDROOT OBJ",
              "size": 783,
              "date": "1988-05-06",
              "time": "23:49"
            },
            {
              "name": "FREEKEYS C",
              "size": 935,
              "date": "1987-11-05",
              "time": "0:26"
            },
            {
              "name": "FREEKEYS OBJ",
              "size": 349,
              "date": "1988-05-06",
              "time": "23:49"
            },
            {
              "name": "GETBASE  C",
              "size": 497,
              "date": "1987-11-05",
              "time": "0:26"
            },
            {
              "name": "GETBASE  OBJ",
              "size": 421,
              "date": "1988-05-06",
              "time": "23:50"
            },
            {
              "name": "GETBTREE C",
              "size": 4236,
              "date": "1987-12-02",
              "time": "14:07"
            },
            {
              "name": "GETBTREE OBJ",
              "size": 1231,
              "date": "1988-05-06",
              "time": "23:50"
            },
            {
              "name": "GETFHDR  C",
              "size": 591,
              "date": "1987-12-02",
              "time": "14:08"
            },
            {
              "name": "GETFHDR  OBJ",
              "size": 416,
              "date": "1988-05-06",
              "time": "23:50"
            },
            {
              "name": "GETINFO  C",
              "size": 568,
              "date": "1987-11-05",
              "time": "0:26"
            },
            {
              "name": "GETINFO  OBJ",
              "size": 420,
              "date": "1988-05-06",
              "time": "23:50"
            },
            {
              "name": "GIVEIDXR C",
              "size": 4733,
              "date": "1988-03-13",
              "time": "2:13"
            },
            {
              "name": "GIVEIDXR OBJ",
              "size": 1049,
              "date": "1988-05-06",
              "time": "23:50"
            },
            {
              "name": "INITDAT  C",
              "size": 1637,
              "date": "1987-11-05",
              "time": "0:27"
            },
            {
              "name": "INITDAT  OBJ",
              "size": 750,
              "date": "1988-05-06",
              "time": "23:50"
            },
            {
              "name": "LIBCBMSS BAK",
              "size": 36864,
              "date": "1988-05-07",
              "time": "0:00"
            },
            {
              "name": "LIBCBMSS LIB",
              "size": 41984,
              "date": "1988-05-07",
              "time": "0:00"
            },
            {
              "name": "LOCKUNLK C",
              "size": 1970,
              "date": "1988-03-20",
              "time": "16:06"
            },
            {
              "name": "LOCKUNLK OBJ",
              "size": 291,
              "date": "1988-05-06",
              "time": "23:50"
            },
            {
              "name": "MEMCPY   C",
              "size": 1281,
              "date": "1987-11-05",
              "time": "6:32"
            },
            {
              "name": "MEMSET   C",
              "size": 301,
              "date": "1987-11-05",
              "time": "0:26"
            },
            {
              "name": "MKLIBMS  BAT",
              "size": 434,
              "date": "1988-03-19",
              "time": "12:58"
            },
            {
              "name": "PUTBTREE C",
              "size": 3418,
              "date": "1987-11-06",
              "time": "13:09"
            },
            {
              "name": "PUTBTREE OBJ",
              "size": 1123,
              "date": "1988-05-06",
              "time": "23:50"
            },
            {
              "name": "PUTFHDR  C",
              "size": 885,
              "date": "1987-11-05",
              "time": "0:26"
            },
            {
              "name": "PUTFHDR  OBJ",
              "size": 417,
              "date": "1988-05-06",
              "time": "23:51"
            },
            {
              "name": "QCLIBMS5 BAT",
              "size": 574,
              "date": "1988-03-19",
              "time": "17:58"
            },
            {
              "name": "SETUPMS  BAT",
              "size": 74,
              "date": "1988-03-19",
              "time": "19:13"
            },
            {
              "name": "SETUPMS5 BAT",
              "size": 88,
              "date": "1988-03-15",
              "time": "10:23"
            },
            {
              "name": "STACKOP  C",
              "size": 1739,
              "date": "1988-03-31",
              "time": "16:59"
            },
            {
              "name": "STACKOP  OBJ",
              "size": 627,
              "date": "1988-05-06",
              "time": "23:51"
            },
            {
              "name": "STRNNCPY C",
              "size": 509,
              "date": "1987-12-02",
              "time": "14:06"
            },
            {
              "name": "STRNNCPY OBJ",
              "size": 335,
              "date": "1988-05-06",
              "time": "23:51"
            },
            {
              "name": "TOUCH    C",
              "size": 1151,
              "date": "1987-11-05",
              "time": "0:26"
            },
            {
              "name": "UPDILVL  C",
              "size": 2059,
              "date": "1987-11-05",
              "time": "0:26"
            },
            {
              "name": "UPDILVL  OBJ",
              "size": 735,
              "date": "1988-05-06",
              "time": "23:51"
            }
          ]
        },
        {
          "path": "/PROGRAMS",
          "files": [
            {
              "name": "BLD2KEYS C",
              "size": 15308,
              "date": "1987-12-02",
              "time": "14:02"
            },
            {
              "name": "BLD2KEYS EXE",
              "size": 35826,
              "date": "1988-05-07",
              "time": "0:20"
            },
            {
              "name": "BLD2KEYS MAP",
              "size": 1403,
              "date": "1988-05-07",
              "time": "0:20"
            },
            {
              "name": "BLD2KEYS OBJ",
              "size": 2893,
              "date": "1988-05-07",
              "time": "0:07"
            },
            {
              "name": "BLDBTREE C",
              "size": 2483,
              "date": "1987-12-02",
              "time": "14:02"
            },
            {
              "name": "BLDBTREE EXE",
              "size": 34074,
              "date": "1988-05-07",
              "time": "0:20"
            },
            {
              "name": "BLDBTREE MAP",
              "size": 1403,
              "date": "1988-05-07",
              "time": "0:21"
            },
            {
              "name": "BLDBTREE OBJ",
              "size": 1412,
              "date": "1988-05-07",
              "time": "0:07"
            },
            {
              "name": "BLDKEY   C",
              "size": 1506,
              "date": "1987-11-05",
              "time": "0:08"
            },
            {
              "name": "BLDKEY   OBJ",
              "size": 544,
              "date": "1988-05-07",
              "time": "0:07"
            },
            {
              "name": "BTPARALL C",
              "size": 1952,
              "date": "1987-11-05",
              "time": "0:09"
            },
            {
              "name": "BTPARALL EXE",
              "size": 15144,
              "date": "1988-05-07",
              "time": "0:21"
            },
            {
              "name": "BTPARALL MAP",
              "size": 1403,
              "date": "1988-05-07",
              "time": "0:21"
            },
            {
              "name": "BTPARALL OBJ",
              "size": 1062,
              "date": "1988-05-07",
              "time": "0:07"
            },
            {
              "name": "BTPARCON C",
              "size": 1832,
              "date": "1987-11-05",
              "time": "0:09"
            },
            {
              "name": "BTPARCON EXE",
              "size": 15000,
              "date": "1988-05-07",
              "time": "0:21"
            },
            {
              "name": "BTPARCON MAP",
              "size": 1403,
              "date": "1988-05-07",
              "time": "0:21"
            },
            {
              "name": "BTPARCON OBJ",
              "size": 843,
              "date": "1988-05-07",
              "time": "0:07"
            },
            {
              "name": "BTPARMS  BTR",
              "size": 196,
              "date": "1987-11-05",
              "time": "0:09"
            },
            {
              "name": "BTPARMS  SAV",
              "size": 196,
              "date": "1987-11-05",
              "time": "0:09"
            },
            {
              "name": "BTPARSE  C",
              "size": 1948,
              "date": "1987-11-05",
              "time": "0:09"
            },
            {
              "name": "BTPARSE  EXE",
              "size": 15142,
              "date": "1988-05-07",
              "time": "0:21"
            },
            {
              "name": "BTPARSE  MAP",
              "size": 1403,
              "date": "1988-05-07",
              "time": "0:21"
            },
            {
              "name": "BTPARSE  OBJ",
              "size": 1058,
              "date": "1988-05-07",
              "time": "0:07"
            },
            {
              "name": "BTPRINT  C",
              "size": 2081,
              "date": "1987-11-05",
              "time": "0:09"
            },
            {
              "name": "BTPRINT  OBJ",
              "size": 1125,
              "date": "1988-05-07",
              "time": "0:08"
            },
            {
              "name": "BTSETUP  C",
              "size": 15550,
              "date": "1988-03-19",
              "time": "17:28"
            },
            {
              "name": "BTSETUP  EXE",
              "size": 15274,
              "date": "1988-05-07",
              "time": "0:21"
            },
            {
              "name": "BTSETUP  MAP",
              "size": 1432,
              "date": "1988-05-07",
              "time": "0:21"
            },
            {
              "name": "BTSETUP  OBJ",
              "size": 5798,
              "date": "1988-05-07",
              "time": "0:08"
            },
            {
              "name": "CALLTYPE C",
              "size": 3091,
              "date": "1987-11-05",
              "time": "0:08"
            },
            {
              "name": "CALLTYPE OBJ",
              "size": 1351,
              "date": "1988-05-07",
              "time": "0:08"
            },
            {
              "name": "CBTRSEQ  C",
              "size": 3881,
              "date": "1988-03-09",
              "time": "9:15"
            },
            {
              "name": "CBTRSEQ  EXE",
              "size": 16466,
              "date": "1988-05-07",
              "time": "0:21"
            },
            {
              "name": "CBTRSEQ  MAP",
              "size": 1403,
              "date": "1988-05-07",
              "time": "0:21"
            },
            {
              "name": "CBTRSEQ  OBJ",
              "size": 1490,
              "date": "1988-05-07",
              "time": "0:08"
            },
            {
              "name": "CCALLMS  BAT",
              "size": 728,
              "date": "1988-01-11",
              "time": "10:40"
            },
            {
              "name": "CCALLMS4 BAT",
              "size": 728,
              "date": "1988-01-11",
              "time": "10:40"
            },
            {
              "name": "CCALLMS5 BAT",
              "size": 390,
              "date": "1988-03-19",
              "time": "19:36"
            },
            {
              "name": "CHGKEY   C",
              "size": 1233,
              "date": "1988-02-01",
              "time": "10:40"
            },
            {
              "name": "CHKBTREE C",
              "size": 7168,
              "date": "1988-01-06",
              "time": "15:41"
            },
            {
              "name": "CHKBTREE EXE",
              "size": 16670,
              "date": "1988-05-07",
              "time": "0:21"
            },
            {
              "name": "CHKBTREE MAP",
              "size": 1403,
              "date": "1988-05-07",
              "time": "0:21"
            },
            {
              "name": "CHKBTREE OBJ",
              "size": 3727,
              "date": "1988-05-07",
              "time": "0:09"
            },
            {
              "name": "CKERROR  MSG",
              "size": 3193,
              "date": "1987-12-03",
              "time": "18:30"
            },
            {
              "name": "DELBTREE C",
              "size": 1080,
              "date": "1987-11-05",
              "time": "0:08"
            },
            {
              "name": "DELBTREE EXE",
              "size": 14926,
              "date": "1988-05-07",
              "time": "0:21"
            },
            {
              "name": "DELBTREE MAP",
              "size": 1403,
              "date": "1988-05-07",
              "time": "0:21"
            },
            {
              "name": "DELBTREE OBJ",
              "size": 567,
              "date": "1988-05-07",
              "time": "0:09"
            },
            {
              "name": "GETBNAME C",
              "size": 825,
              "date": "1987-12-02",
              "time": "14:01"
            },
            {
              "name": "GETBNAME OBJ",
              "size": 656,
              "date": "1988-05-07",
              "time": "0:09"
            },
            {
              "name": "GETFNAME C",
              "size": 1348,
              "date": "1987-11-05",
              "time": "0:08"
            },
            {
              "name": "GETFNAME OBJ",
              "size": 735,
              "date": "1988-05-07",
              "time": "0:09"
            },
            {
              "name": "GETFPAT  C",
              "size": 815,
              "date": "1987-11-05",
              "time": "0:08"
            },
            {
              "name": "GETFPAT  OBJ",
              "size": 465,
              "date": "1988-05-07",
              "time": "0:09"
            },
            {
              "name": "GETFPATV C",
              "size": 1846,
              "date": "1987-11-05",
              "time": "0:08"
            },
            {
              "name": "GETFPATV OBJ",
              "size": 777,
              "date": "1988-05-07",
              "time": "0:09"
            },
            {
              "name": "ITOA     C",
              "size": 1025,
              "date": "1987-11-05",
              "time": "0:09"
            },
            {
              "name": "ITOA     OBJ",
              "size": 504,
              "date": "1988-05-07",
              "time": "0:09"
            },
            {
              "name": "LNALLMS  BAT",
              "size": 1009,
              "date": "1987-12-27",
              "time": "13:14"
            },
            {
              "name": "LNALLMS5 BAT",
              "size": 1176,
              "date": "1988-03-20",
              "time": "15:00"
            },
            {
              "name": "LOOKHDR  C",
              "size": 1179,
              "date": "1987-11-05",
              "time": "0:09"
            },
            {
              "name": "LOOKHDR  EXE",
              "size": 10752,
              "date": "1988-05-07",
              "time": "0:21"
            },
            {
              "name": "LOOKHDR  MAP",
              "size": 1403,
              "date": "1988-05-07",
              "time": "0:21"
            },
            {
              "name": "LOOKHDR  OBJ",
              "size": 698,
              "date": "1988-05-07",
              "time": "0:09"
            },
            {
              "name": "LTOA     C",
              "size": 464,
              "date": "1987-11-05",
              "time": "0:08"
            },
            {
              "name": "LTOA     OBJ",
              "size": 348,
              "date": "1988-05-07",
              "time": "0:10"
            },
            {
              "name": "MAKBTREE C",
              "size": 528,
              "date": "1987-11-05",
              "time": "0:08"
            },
            {
              "name": "MAKBTREE EXE",
              "size": 17478,
              "date": "1988-05-07",
              "time": "0:21"
            },
            {
              "name": "MAKBTREE MAP",
              "size": 1403,
              "date": "1988-05-07",
              "time": "0:21"
            },
            {
              "name": "MAKBTREE OBJ",
              "size": 427,
              "date": "1988-05-07",
              "time": "0:10"
            },
            {
              "name": "PATIENT  DAT",
              "size": 128,
              "date": "1988-05-07",
              "time": "0:28"
            },
            {
              "name": "PATIENT  IDX",
              "size": 8960,
              "date": "1988-05-07",
              "time": "0:28"
            },
            {
              "name": "PATIENT  RAW",
              "size": 19584,
              "date": "1987-11-05",
              "time": "0:08"
            },
            {
              "name": "PATREC   STR",
              "size": 393,
              "date": "1987-11-05",
              "time": "0:08"
            },
            {
              "name": "PRNTKEYS C",
              "size": 2949,
              "date": "1987-12-15",
              "time": "15:28"
            },
            {
              "name": "PRNTKEYS EXE",
              "size": 14476,
              "date": "1988-05-07",
              "time": "0:22"
            },
            {
              "name": "PRNTKEYS MAP",
              "size": 1403,
              "date": "1988-05-07",
              "time": "0:22"
            },
            {
              "name": "PRNTKEYS OBJ",
              "size": 1104,
              "date": "1988-05-07",
              "time": "0:10"
            },
            {
              "name": "PUTFPAT  C",
              "size": 1020,
              "date": "1987-11-05",
              "time": "0:08"
            },
            {
              "name": "PUTFPAT  OBJ",
              "size": 466,
              "date": "1988-05-07",
              "time": "0:10"
            },
            {
              "name": "PUTFPATV C",
              "size": 1738,
              "date": "1987-11-05",
              "time": "0:08"
            },
            {
              "name": "PUTFPATV OBJ",
              "size": 889,
              "date": "1988-05-07",
              "time": "0:10"
            },
            {
              "name": "QCALLMS5 BAT",
              "size": 395,
              "date": "1988-03-19",
              "time": "14:01"
            },
            {
              "name": "README   230",
              "size": 13553,
              "date": "1987-11-05",
              "time": "0:09"
            },
            {
              "name": "README   SET",
              "size": 7053,
              "date": "1987-11-05",
              "time": "0:08"
            },
            {
              "name": "TIMECB5  C",
              "size": 8999,
              "date": "1988-03-13",
              "time": "22:52"
            },
            {
              "name": "TIMECB5  EXE",
              "size": 35926,
              "date": "1988-05-07",
              "time": "0:22"
            },
            {
              "name": "TIMECB5  MAP",
              "size": 1403,
              "date": "1988-05-07",
              "time": "0:22"
            },
            {
              "name": "TIMECB5  OBJ",
              "size": 2170,
              "date": "1988-05-07",
              "time": "0:10"
            },
            {
              "name": "USERBTR  C",
              "size": 24181,
              "date": "1988-03-31",
              "time": "17:02"
            },
            {
              "name": "USERBTR  EXE",
              "size": 39550,
              "date": "1988-05-07",
              "time": "0:22"
            },
            {
              "name": "USERBTR  MAP",
              "size": 1403,
              "date": "1988-05-07",
              "time": "0:22"
            },
            {
              "name": "USERBTR  OBJ",
              "size": 10708,
              "date": "1988-05-07",
              "time": "0:11"
            },
            {
              "name": "ZAPHDR   C",
              "size": 2208,
              "date": "1988-03-19",
              "time": "17:28"
            },
            {
              "name": "ZAPHDR   EXE",
              "size": 11200,
              "date": "1988-05-07",
              "time": "0:22"
            },
            {
              "name": "ZAPHDR   MAP",
              "size": 1403,
              "date": "1988-05-07",
              "time": "0:22"
            },
            {
              "name": "ZAPHDR   OBJ",
              "size": 1396,
              "date": "1988-05-07",
              "time": "0:11"
            }
          ]
        }
      ],
      "volume": "BACKUP  001"
    }
  },
  "desc_file": "README.230",
  "desc_text": "                 RELEASE SHEET for CBTREE Version 2.30\r\n                           Revised 11/01/87\r\n\r\nThis document describes the changes which you must make to your source code\r\nin order to upgrade from version 1.3x to version 2.x.  BACKUP ALL YOUR SOURCE\r\nAND INDEX FILES BEFORE PROCEEDING!\r\n\r\n1. btrinit() now allocates memory for btcommo.btkey. This means you should\r\n   not do this.  The number of bytes allocated is btcommo.btkeylen + 1.\r\n   btcommo.btkeylen is defined by BTSETUP.EXE.\r\n\r\n2. A new function btrterm(&btcommo) has been added to de-initialize your\r\n   B+tree.  It currently releases memory allocated for btcommo.btkey and\r\n   btcommo.btrecnum.  You should call this function instead of directly\r\n   freeing btcommo.btkey.  This function will have increased functionality\r\n   in future releases.  Therefore it is very important to start using the\r\n   btrinit()/btrterm() function pair.\r\n\r\n3. btcommo.btrecnum used to be an array of MAXARRAY longs.  It is now a\r\n   pointer to a dynamically allocated memory block which is allocated in\r\n   btrinit(). The number of bytes allocated is:\r\n\r\n                      sizeof(long) * (btcommo.btmax + 1).\r\n\r\n   btcommo.btmax is defined in BTSETUP.EXE as the field Max Recs.  The main\r\n   impact of this on your source is that all occurrences of MAXARRAY-1 should\r\n   be replaced with btcommo.btmax.\r\n\r\n4. GETSEQ, GETALL and the new function GETKEYS often need to be called\r\n   several times in sequence before the entire index has been scanned.  These\r\n   functions now maintain internal variables which remember the state of the\r\n   function between calls.  This means:\r\n     o  Improved performance,\r\n     o  the original key no longer has to be re-loaded between calls\r\n        (although this will have no harmful effect),\r\n     o  the functions *MUST* be called repeatedly until a less than full\r\n        block is returned (fewer than btcommo.btmax record numbers were\r\n        returned), or BTNOTFND was returned.  If the calling sequence is to\r\n        be terminated before one of these conditions is met, the function\r\n        free_svkey(&btcommo) *MUST* be called.  This is in order to reset the\r\n        internal variables.  Not doing this may be dangerous to the health of\r\n        your B+trees.\r\n\r\nVersion 2.10:\r\n\r\n5. The CBTREE NULL key value has been changed from three 7F's to a single 7F\r\n   in order to support key lengths of less than 3 characters.  This means\r\n   that the first character of all keys must be between 0x01 and 0x7e\r\n   inclusive.  This is typical for ASCII keys.\r\n\r\n6. The source file 'btgiver.c' has been renamed to 'giveidxr.c'.\r\n\r\n7. The external variable 'freespc' has been removed.  The functions which\r\n   used 'freespc' have therefore been modified to receive 'freespc' as a\r\n   parameter.  These include:\r\n\r\n      putfhdr(fd, freespc)   and   getfhdr(freespc, fd).\r\n\r\n   This is of importance only to those users who use these lower level\r\n   functions.\r\n\r\n8. A macro btseek() has been added to cbtree.h.  This is useful in seeking\r\n   to a record specified by btcommo.btloc.  The usage of the macro is:\r\n\r\n      btseek(fd, btloc, reclen).\r\n\r\n   For example, after calling GETREC for a given key, you would call:\r\n\r\n      btseek(fd, btcommo.btloc, btcommo.btdatlen);\r\n\r\n   to seek to the desired record.  btseek() takes care of the \"record\r\n   location minus one\" arithmetic for you.  See getfpat.c for a simple\r\n   example on the use of btseek().\r\n   IMPORTANT NOTE:  The btcommo.btloc return value may change in a future\r\n                    release.  We therefore recommend that you start using\r\n                    btseek() so that this possible future change will\r\n                    be transparent to your source code.\r\n\r\n9.  A new function bt_open() has been added to support the new file\r\n    protection mode paramters of the open() function.  bt_open() also\r\n    maintains compatibility with older compilers.  You should use bt_open()\r\n    instead of open() to open ALL your data and index files, especially\r\n    at places where a new file may be created.  See btfio.h for more\r\n    information.  See bld2keys.c for an example on how to use bt_open().\r\n\r\nVersion 2.11:\r\n\r\n10. A new utility CHKBTREE.C has been added and performs integrity checks on\r\n    the specified B+tree index file.\r\n\r\n11. Bug fix for GETALL and GETKEYS: if the final call to a series of GETALL\r\n    operations happened to exactly fill the btcommo.btrecnum block, then\r\n    the NEXT call to GETALL/GETKEYS would not return BTNOTFND, as it should\r\n    have.  Now it does.\r\n\r\n12. A buffer-full check in getidxr() allowed 4 bytes too many to be read into\r\n    the buffer.  This has now been fixed.\r\n\r\n13. Reminder: the cbtree() error messages are stored in the file\r\n    \"ckerror.msg.\"  If you would like verbose error messages to be displayed,\r\n    instead of just numerical codes, keep a copy of this file in the current\r\n    directory.  Error messages will also get written to the file \"error.fil\"\r\n    when they occur.\r\n\r\nVersion 2.20:\r\n\r\n14. Version 2.20 allows multiple B+trees to be stored in a single index file.\r\n    In order to support this enhancement, several changes have been made to\r\n    the CBTREE library functions as well as the support utilities:\r\n\r\n       o   BTSETUP.EXE has a new field for the Index File Name.  The default\r\n           name will be your B+tree Name plus the extention \".idx\".  The TBA\r\n           field should be left zero for now.  If you desire multiple\r\n           B+trees to reside in the same Index File, then you should specify\r\n           the SAME Index File Name for ALL the B+trees that are to be\r\n           contained in it.  BTSETUP.EXE now has a Delete function to allow\r\n           you to delete a particular B+tree entry.\r\n\r\n       o   BTPARMS.BTR has an expanded structure.  BTSETUP.EXE should be run\r\n           for each of your B+trees to update the BTPARMS.BTR file.  Each of\r\n           your B+tree entries should be \"edited,\" then the resulting new\r\n           settings should be saved.  This is to make your parameter file\r\n           compatible with the changes made to support multiple B+trees in a\r\n           single index file.\r\n\r\n       o   btrinit() has been enhanced to use the new information in the\r\n           BTPARMS.BTR file.  In particular, btrinit() now initializes the\r\n           new btcommo structure member \"idxname\" with the Index File Name\r\n           which you speicified in BTSETUP.EXE.  We urge to refer to\r\n           your index file names through btcommo.idxname, as when you\r\n           bt_open() your index files.\r\n\r\n       o   If creatbtr() is called, it should be called IMMEDIATELY\r\n           following the corresponding call to btrinit(), and BEFORE any\r\n           subsequent calls to btrinit().  This is extremely important when\r\n           multiple B+trees are contained in a single index file.\r\n\r\n       o   creatbtr() now only takes a single parameter (the address of the\r\n           btcommo structure), since the second parameter (the Index file\r\n           Name) is now included in the btcommo structure.\r\n           creatbtr() has been substantially modified for use with multiple\r\n           B+trees in a single index file.  Previously, creatbtr() would\r\n           always truncate an existing index file and initialize it with a\r\n           single empty root node.  Since there may be mutiple B+trees in an\r\n           index file, creatbtr() CANNOT now truncate the file without\r\n           destroying the other B+trees as well.  If more than one B+tree\r\n           already exists in a given index file, creatbtr() will now delete\r\n           ONLY those nodes belonging to that B+tree. This process can take\r\n           several moments and it is therefore recommended that you develop\r\n           an application (if possible) using separate index files for each\r\n           B+tree. After development you can easily place all your B+trees\r\n           in a single index file.  See Bld2keys.c which supports both\r\n           methods.\r\n\r\nVersion 2.21:\r\n\r\n15. The portable file opening function bt_open() now supports the O_CREAT\r\n    mode flag.  Normally O_NEW is used to specify a new/empty file.\r\n    O_CREAT will leave an existing file untouched.\r\n\r\n16. All modules which use bt_open() should include the CBTREE file I/O\r\n    header \"btfio.h\".\r\n\r\n17. The error reporting function ckerror() now uses low-level file\r\n    descriptors to write to ERROR.FIL.  This means that the CBTREE Library\r\n    proper now has NO EXPLICIT references to FILE streams.  The library\r\n    still has implicit references 'stdout' via calls to printf(), etc., but\r\n    these can easily be removed without effecting the functionality of the\r\n    library.\r\n\r\n18. Support added for Ecosoft C compiler and Amiga Manx compiler.  Special\r\n    thanks to David E. Holt for his work in porting to the Amiga Manx\r\n    compiler.\r\n\r\nVersion 2.30:\r\n\r\n19. This version adds support for variable length records.  The support\r\n    functions are in the file btvarlen.c.  With a few exceptions, variable\r\n    length records opereate the same way as fixed-length records.  The\r\n    support programs have all been modified (as applicable) to use a sample\r\n    variable length data file.  Simply invoke the program with the \"-v\"\r\n    option and it will use the variable length database.  In particular:\r\n      o  BLD2KEYS -v   -- build a working database w/ two keys\r\n      o  USERBTR  -v   -- interactive demonstration\r\n      o  BLDBTREE -v   -- rebuilds the primary B+tree\r\n      o  CBTRSEQ  -v   -- goes \"inside\" the B+tree for sequential keys\r\n      o  TIMECB5  -v   -- sample CBTREE operation timing suite\r\n\r\n20. To invoke variable-length records, specify a Data Record Length of 0\r\n    (zero) in BTSETUP.EXE.  Make sure ALL indexes for a given data file\r\n    agree!\r\n\r\n21. Bld2keys.c is now especially well commented and is a good starting point\r\n    for looking into variable length records.\r\n\r\n22. A new function initdat(fd, &btcommo) has been added to the library which\r\n    will automatically initialize your data file header record.  It will\r\n    work properly for both fixed- and variable-length records.\r\n\r\n23. Before calling INSERT, btcommo.btdtalen must be set to the length of\r\n    your (variable-length) record.  This is only required for the INSERT\r\n    operation, and when using variable-length records.\r\n\r\n24. The macro btseekv(fd, recloc, recsiz) has been added to cbtree.h for use\r\n    with variable length records.  It is designed to be compatible with\r\n    btseek().\r\n\r\n25. The functions in getfpatv.c and putfpatv.c (c.f. getfpat.c and\r\n    putfpat.c) demonstrate getting and putting variable-length records.\r\n\r\n26. Two varaible length record functions will be directly needed by your\r\n    application:\r\n      o  btsizvar(fd, recloc), and\r\n      o  btnxtvar(fd, recloc).\r\n\r\n    btsizvar() will return the size of the record at the specified record\r\n    location.  You will need to call this function before reading your\r\n    record so you know how much to read.\r\n\r\n    btnxtvar() will return the location of the next record after the given\r\n    one.  If the 'recloc' is 1L (an \"illegal\" record location), it will\r\n    return the location of the FIRST record.  This function can be used for\r\n    scanning your data base or re-indexing.  See bldbtree.c for an example.\r\n\r\n27. The program MKCBTREE.EXE has been renamed to MAKBTREE.EXE.\r\n\r\n28. The program CKBTREE.EXE has been renamed to CHKBTREE.EXE.\r\n\r\n29. The program DELBTREE.EXE has been provided to delete a B+tree from an\r\n    index file.  If the index file has more than one B+tree, it will delete\r\n    only those nodes belonging to the one specified.\r\n\r\nSUMMARY:\r\n1.  Take out memory allocation calls for btcommo.btkey.\r\n2.  Replace calls to free btcommo.btkey with btrterm(&btcommo).\r\n3.  Replace occurrences of MAXARRAY-1 with btcommo.btmax.\r\n4.  GETSEQ, GETALL and GETKEYS must be called repeatedly until fewer than\r\n    btcommo.btmax records are returned.  Otherwise free_svkey(&btcommo) must\r\n    be called.\r\n5.  Declare local version of 'freespc' (where used) and pass as parameter to\r\n    getfhdr() and putfhdr().\r\n6.  Replace all  lseek( fd, (btloc-1) * reclen, 0 )  calls with\r\n                btseek(fd,  btloc, reclen)  invocations.\r\n7.  Use bt_open() instead of open(), and include \"btfio.h\".\r\n8.  Keep the error message file \"ckerror.msg\" in the current directory for\r\n    verbose error messages.\r\n9.  Run BTSETUP and enter the \"edit\" mode for EACH of your B+trees.  Enter\r\n    the proper name for the Index File corresponding to each of your B+trees.\r\n    Then [S]ave the new settings.  The file BTPARMS.BTR will be updated.\r\n10. Include \"btfio.h\" in those modules that use bt_open().\r\n11. All calls to creatbtr() (if any) should be placed immediately after the\r\n    corresponding call to btrinit() and before any further calls to\r\n    btrinit().  This is REQUIRED if you are placing multiple B+trees in a\r\n    single index file.\r\n12. Use the function initdat(fd, &btcommo) to initialize your data file\r\n    header record.\r\n13. Use btsizvar() to get the size of your variable length data record.\r\n    Then use btseekv() to seek to it.  Then read it.  HINT:  since the\r\n    record size is embedded in the data file, use btsizvar() only just\r\n    before reading the data record.  This will reduce overall access time.\r\n\r\nNOTE: Run BTSETUP.EXE and specify the value you had for MAXARRAY-1 as\r\n      Max Recs.  See Appendix B in the manual: you may have to re-index if\r\n      Cells Per Index Block is changed by BTSETUP.EXE."
}