import "io" import "string" /* ins(dest, maxlen) // dest must have maxlen + 1 bytes strncpy(dest, maxlen, src) // dest must have maxlen + 1 bytes strcpyarr(dest, src, sizeinbytes) // from array to string, same req arrcpystr(dest, sizeinbytes, src) // from string to array strcmp(a, b) */ manifest { BN_SUPER = 0, BN_DIRECTORY = 1, SB_NUMFREE = 0, SB_FIRSTFREE = 1, DIR_NUMENTS = 25, DIRE_NAME = 0, DIRE_NAMELEN = 2, DIRE_DATE = 2, DIRE_FIRST = 3, DIRE_LENGTH = 4, DIRE_SIZE = 5 } let clear_buffer(buff) be for i = 0 to 127 do buff ! i := 0; let superblock = vec(128), rootdir = vec(128); let convtodate(t) = 2000.0 #+ float(t) #/ float(365 * 24 * 60 * 60) let get_dir_entry(cmd) be { let ptr = rootdir; for i=0 to DIR_NUMENTS-1 do { if ptr ! DIRE_NAME = 0 then { arrcpystr(ptr + DIRE_NAME, DIRE_NAMELEN * 4, cmd); resultis i } // CORRECTED: // forgot to update ptr, so it just looked at // entry 0 twenty-five times ptr +:= DIRE_SIZE; } resultis -1 } let set_dir_entry(de, b1, len, tim) be { let ptr = rootdir + de * DIRE_SIZE; // CORRECTED: // hadn't checked for invalid parameter if de<0 \/ de>=DIR_NUMENTS then { out("invalid entry number %d\n", de); resultis -1 } ptr ! DIRE_LENGTH := len; ptr ! DIRE_FIRST := b1; ptr ! DIRE_DATE := seconds(); resultis 0; } let printinfo() be { let ptr = rootdir, dest = vec(3); out("%d free blocks\n", superblock ! SB_NUMFREE); out("first free block %d\n", superblock ! SB_FIRSTFREE); for i=0 to DIR_NUMENTS-1 do { out("%2d: '%s' length = %d, block1 = %d, date = %f\n", i, strcpyarr(dest, ptr, 4*DIRE_NAMELEN), ptr ! DIRE_LENGTH, ptr ! DIRE_FIRST, convtodate(ptr ! DIRE_DATE)); ptr +:= DIRE_SIZE; } } let start() be { let buff = vec(128); let r; r := devctl(DC_DISC_CHECK, 1); out("disc check: %d blocks total\n", r); r := devctl(DC_DISC_READ, 1, BN_SUPER, 1, superblock); test r >= 0 then out("super-block read OK\n") else out("error %d reading super-block\n", r); r := devctl(DC_DISC_READ, 1, BN_DIRECTORY, 1, rootdir); test r >= 0 then out("directory read OK\n") else out("error %d reading directory\n", r); while true do { let cmd = vec(10); out("> "); ins(cmd, 39); if strcmp(cmd, "ls") = 0 then { printinfo(); loop } if strcmp(cmd, "create") = 0 then { let de; out("name: "); ins(cmd, 39); de := get_dir_entry(cmd); // CORRECTED: // hadn't checked for error return if de < 0 then { outs("error - directory full\n"); loop } out("using entry %d\n", de); set_dir_entry(de, 111, 2222, seconds()) ; loop } // CORRECTED: // Didn't bother reporting incorrect commands out("What do you mean, '%s'?\n", cmd) } printinfo() }