diff --git a/lib/stdlib.pas b/lib/stdlib.pas index c1da7de..cbd0840 100644 --- a/lib/stdlib.pas +++ b/lib/stdlib.pas @@ -47,7 +47,7 @@ type file = record ateof:boolean; noecho:boolean; (* read chars are not echoed *) raw:boolean; (* turn off backspace processing on input, CR processing on output *) - nointr: boolean); (* turn off keyboard interrupt character processing *) + nointr:boolean); (* turn off keyboard interrupt character processing *) IODiskFile: (volumeid: integer;fileno: integer; filpos:integer; bufStart:integer; size:integer; sizeExtents:integer; @@ -480,6 +480,9 @@ end; That means you cannot use pos to search inside a string literal. Hopefully this is not something you want to do. *) + +(* TODO: UCSD-Pascal and TP3.0 specs say, searched string + is a string expression so cannot be var parameter *) function pos(substr:string;var s:string):integer; var substrlen:integer; slen:integer; diff --git a/pcomp/pcomp.pas b/pcomp/pcomp.pas index 205ee3f..8936f7a 100644 --- a/pcomp/pcomp.pas +++ b/pcomp/pcomp.pas @@ -1,4 +1,6 @@ (* Copyright 2021-2024 Sebastian Lederer. See the file LICENSE.md for details *) +{$H384} +{$S64} program PascalCompiler; {$R+} {$!}{$ifdef FPC}uses math,crt;{$endif} diff --git a/progs/editor.pas b/progs/editor.pas index 070aaed..d6ec563 100644 --- a/progs/editor.pas +++ b/progs/editor.pas @@ -137,7 +137,8 @@ end; procedure getScreenSize; var c:char; begin - (* empty keyboard buffer *) + (* empty keyboard buffer to make sure GetTermSize + can read the response from the terminal *) while conavail do read(con, c); GetTermSize(screenW, screenH); @@ -1661,11 +1662,10 @@ end; procedure gotoLine(l:integer); begin - if l < 1 then - l := 1 - else if l > lineCount then l := lineCount; + if l < 1 then + l := 1; topY := l - (screenH div 2); if topY < 1 then @@ -1713,7 +1713,7 @@ var error:integer; begin success := true; if isModified then - save; + writeFile(success); if success then begin if isAsmFile(filename) then diff --git a/utils/tdrimg.py b/utils/tdrimg.py index 38308ff..0c9622a 100644 --- a/utils/tdrimg.py +++ b/utils/tdrimg.py @@ -239,7 +239,7 @@ def listvolumes(img): return firstvolume -def listdir(img, part, verbose=False): +def listdir(img, part, verbose=False, deleted=False): print("Directory of {}:".format(part.name)) slotno = 0 done = False @@ -247,6 +247,8 @@ def listdir(img, part, verbose=False): slot = getdirslot(img, part, slotno) if (slot.flags & SlotFirst): print(slot.name, slot.sizeBytes, slotno) + elif deleted and (slot.flags & SlotDeleted): + print(slot.name, slot.sizeBytes, slotno, slot.generation) else: if verbose: print(flags2str(slot.flags)) @@ -272,6 +274,21 @@ def findfile(img, part, name): return None +def finddeleted(img, part, name, gen): + slotno = 0 + done = False + while not done: + slot = getdirslot(img, part, slotno) + if slot.flags & SlotDeleted: + if slot.name == name and slot.generation == gen: + return slotno + slotno += 1 + if (slot.flags & SlotEndScan) or (slotno >= part.dirSize): + done = True + + return None + + def readfile(img, part, slotno): pos = part.startBlock * 512 + slotno * part.extentSize dirslot = getdirslot(img, part, slotno) @@ -317,6 +334,24 @@ def readfromimg(img, pathname,outfilepath): f.write(data) +def recoverfromimg(img, pathname, gen, outfilepath): + vol, filename = parsepath(img, pathname) + if vol is None: + return + + listdir(img, vol, deleted=True) + + slotno = finddeleted(img, vol, filename, gen) + if slotno is None: + print("File", filename,"not found with generation no", gen) + return + + data = readfile(img, vol, slotno) + + with open(outfilepath, "wb") as f: + f.write(data) + + def writetoimg(img, pathname, infilepath): vol, filename = parsepath(img, pathname) if vol is None: @@ -555,6 +590,9 @@ if __name__ == "__main__": if sys.argv[1] == "get": f = open(sys.argv[2], "rb") readfromimg(f, sys.argv[3], sys.argv[4]) + elif sys.argv[1] == "recover": + f = open(sys.argv[2], "rb") + recoverfromimg(f, sys.argv[3], int(sys.argv[4]), sys.argv[5]) elif sys.argv[1] == "put": imgfile = open(sys.argv[2], "r+b") infilepath = sys.argv[3]