diff --git a/src/compiler/OPM.Mod b/src/compiler/OPM.Mod index a5a3df1a..eb41b52c 100644 --- a/src/compiler/OPM.Mod +++ b/src/compiler/OPM.Mod @@ -588,15 +588,22 @@ MODULE OPM; (* RC 6.3.89 / 28.6.89, J.Templ 10.7.89 / 22.7.96 *) END CloseOldSym; PROCEDURE OldSym*(VAR modName: ARRAY OF CHAR; VAR done: BOOLEAN); - VAR tag, ver: CHAR; fileName: FileName; + VAR tag, ver: CHAR; fileName: FileName; res: INTEGER; BEGIN + oldSFile := NIL; done := FALSE; MakeFileName(modName, fileName, SFext); - oldSFile := Files.Old(fileName); done := oldSFile # NIL; - IF done THEN - Files.Set(oldSF, oldSFile, 0); Files.Read(oldSF, tag); Files.Read(oldSF, ver); - IF (tag # SFtag) OR (ver # SFver) THEN - err(-306); (*possibly a symbol file from another Oberon implementation, e.g. HP-Oberon*) - CloseOldSym; done := FALSE + IF forcenewsym IN Options THEN + Files.Delete(fileName, res) + ELSE + oldSFile := Files.Old(fileName); done := oldSFile # NIL; + IF done THEN + Files.Set(oldSF, oldSFile, 0); Files.Read(oldSF, tag); Files.Read(oldSF, ver); + IF (tag # SFtag) OR (ver # SFver) THEN + (* Possibly a symbol file from another Oberon implementation, e.g. HP-Oberon, + or from a symbol incompatible version of this Oberon. *) + IF ~(newsf IN Options) THEN err(-306) END; + CloseOldSym; done := FALSE + END END END END OldSym;