Compare commits

...

3 commits

Author SHA1 Message Date
slederer
f18176e3fa tdrimg: add recover command
- recover reads old file versions from the sdcard image
2025-01-13 01:51:20 +01:00
slederer
2f81ee73e1 editor: abort in buildNRun if save fails
- also fix possible bug in gotoLine if
  file is empty
2025-01-13 01:49:48 +01:00
slederer
74a467cba6 pcomp: Increase heap and stack sizes 2025-01-12 00:02:54 +01:00
4 changed files with 50 additions and 7 deletions

View file

@ -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;

View file

@ -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}

View file

@ -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

View file

@ -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]