Понадобилась программа, чтобы склеивать ресурсные файлы в прошивку.
Вот такой код выделяется с двух сторон коммандерами, и запускается первый коммандер
Код:
RecBake.Join "Final.bin"
0H "Tablet.bin"
24000H "Fonts/Files/PTAstraSans16.fbin"
28000H "Fonts/Files/PTAstraSans23.fbin"
Получается файл прошивки Final.bin, в котором все ресурсы по нужным адресам.
Подумал, что может быть полезно, как пример для новичков, как работать с файлами в Блэкбоксе.
Код:
MODULE RecBake;
IMPORT Log, Files, TextModels, TextMappers, DevCommanders;
VAR rd: Files.Reader; s: TextMappers.Scanner;
PROCEDURE Join*;
VAR p: DevCommanders.Par; error: BOOLEAN;
res, src: Files.File; wr: Files.Writer; rd: Files.Reader;
resName, path, name: Files.Name; n, i, pos: INTEGER; b: BYTE;
BEGIN
p := DevCommanders.par;
IF p # NIL THEN
DevCommanders.par := NIL;
s.ConnectTo(p.text); s.SetPos(p.beg);
s.SetOpts(s.opts + {TextMappers.returnViews});
s.Scan;
IF s.type = TextMappers.string THEN
Log.String(s.string); Log.Ln;
resName := s.string$;
error := FALSE;
res := Files.dir.New(Files.dir.This(""), Files.shared);
wr := res.NewWriter(NIL);
REPEAT
s.Scan;
IF s.type # TextMappers.view THEN
IF s.type = TextMappers.int THEN
Log.Int(s.int); Log.Ln;
WHILE wr.Pos() < s.int DO
wr.WriteByte(0)
END;
s.Scan;
IF s.type = TextMappers.string THEN
Log.String(s.string); Log.Ln;
i := 0; pos := 0;
path := s.string$;
WHILE i < LEN(path$) DO IF path[i] = "/" THEN pos := i END; INC(i) END;
path[pos] := 0X;
i := pos; n := 0;
WHILE i < LEN(s.string$) DO name[n] := s.string[i]; INC(i); INC(n) END;
name[n] := 0X;
src := Files.dir.Old(Files.dir.This(path), name, Files.shared);
IF src # NIL THEN
rd := src.NewReader(NIL);
WHILE ~rd.eof DO
rd.ReadByte(b);
IF ~rd.eof THEN wr.WriteByte(b) END
END
ELSE
error := TRUE; Log.String('не удалось открыть файл'); Log.Ln
END;
ELSE
error := TRUE;
Log.String('ошибка, ожидается формат: 0H "/path/name.bin"'); Log.Ln;
END;
ELSE
error := TRUE;
Log.String('ошибка, ожидается формат: 0H "/path/name.bin"'); Log.Ln;
END;
END
UNTIL (s.type = TextMappers.view) OR (s.Pos() >= p.end) OR error;
IF ~error THEN res.Register(resName, "", Files.dontAsk, n) END;
ELSE
Log.String("ожидается название файла финальной прошивки"); Log.Ln;
END
END
END Join;
END RecBake.