(* BSD 2-Clause License Copyright (c) 2018-2020, Anton Krotov All rights reserved. *) MODULE Compiler; IMPORT ST := STATEMENTS, PARS, UTILS, PATHS, PROG, C := CONSOLE, ERRORS, STRINGS, WRITER, MSP430, THUMB, TARGETS; PROCEDURE keys (VAR options: PROG.OPTIONS; VAR out: PARS.PATH); VAR param: PARS.PATH; i, j: INTEGER; end: BOOLEAN; value: INTEGER; minor, major: INTEGER; checking: SET; BEGIN out := ""; checking := options.checking; end := FALSE; i := 3; REPEAT UTILS.GetArg(i, param); IF param = "-stk" THEN INC(i); UTILS.GetArg(i, param); IF STRINGS.StrToInt(param, value) & (1 <= value) & (value <= 32) THEN options.stack := value END; IF param[0] = "-" THEN DEC(i) END ELSIF param = "-out" THEN INC(i); UTILS.GetArg(i, param); IF param[0] = "-" THEN DEC(i) ELSE out := param END ELSIF param = "-ram" THEN INC(i); UTILS.GetArg(i, param); IF STRINGS.StrToInt(param, value) THEN options.ram := value END; IF param[0] = "-" THEN DEC(i) END ELSIF param = "-rom" THEN INC(i); UTILS.GetArg(i, param); IF STRINGS.StrToInt(param, value) THEN options.rom := value END; IF param[0] = "-" THEN DEC(i) END ELSIF param = "-nochk" THEN INC(i); UTILS.GetArg(i, param); IF param[0] = "-" THEN DEC(i) ELSE j := 0; WHILE param[j] # 0X DO IF param[j] = "p" THEN EXCL(checking, ST.chkPTR) ELSIF param[j] = "t" THEN EXCL(checking, ST.chkGUARD) ELSIF param[j] = "i" THEN EXCL(checking, ST.chkIDX) ELSIF param[j] = "b" THEN EXCL(checking, ST.chkBYTE) ELSIF param[j] = "c" THEN EXCL(checking, ST.chkCHR) ELSIF param[j] = "w" THEN EXCL(checking, ST.chkWCHR) ELSIF param[j] = "r" THEN EXCL(checking, ST.chkCHR); EXCL(checking, ST.chkWCHR); EXCL(checking, ST.chkBYTE) ELSIF param[j] = "a" THEN checking := {} END; INC(j) END; END ELSIF param = "-ver" THEN INC(i); UTILS.GetArg(i, param); IF STRINGS.StrToVer(param, major, minor) THEN options.version := major * 65536 + minor END; IF param[0] = "-" THEN DEC(i) END ELSIF param = "-pic" THEN options.pic := TRUE ELSIF param = "" THEN end := TRUE ELSE ERRORS.BadParam(param) END; INC(i) UNTIL end; options.checking := checking END keys; PROCEDURE OutTargetItem (target: INTEGER; text: ARRAY OF CHAR); VAR width: INTEGER; BEGIN width := 15; width := width - LENGTH(TARGETS.Targets[target].ComLinePar) - 4; C.String(" '"); C.String(TARGETS.Targets[target].ComLinePar); C.String("'"); WHILE width > 0 DO C.String(20X); DEC(width) END; C.StringLn(text) END OutTargetItem; PROCEDURE main; VAR path: PARS.PATH; inname: PARS.PATH; ext: PARS.PATH; app_path: PARS.PATH; lib_path: PARS.PATH; modname: PARS.PATH; outname: PARS.PATH; param: PARS.PATH; temp: PARS.PATH; target: INTEGER; time: INTEGER; options: PROG.OPTIONS; BEGIN options.stack := 2; options.version := 65536; options.pic := FALSE; options.checking := ST.chkALL; PATHS.GetCurrentDirectory(app_path); lib_path := app_path; UTILS.GetArg(1, inname); C.Ln; C.String("Akron Oberon Compiler v"); C.Int(UTILS.vMajor); C.String("."); C.Int2(UTILS.vMinor); C.String(" ("); C.Int(UTILS.bit_depth); C.StringLn("-bit)"); C.StringLn("Copyright (c) 2018-2020, Anton Krotov"); IF inname = "" THEN C.Ln; C.StringLn("Usage: Compiler
[optional settings]"); C.Ln; C.StringLn("target ="); IF UTILS.bit_depth = 64 THEN OutTargetItem(TARGETS.Win64C, "Windows64 Console"); OutTargetItem(TARGETS.Win64GUI, "Windows64 GUI"); OutTargetItem(TARGETS.Win64DLL, "Windows64 DLL"); OutTargetItem(TARGETS.Linux64, "Linux64 Exec"); OutTargetItem(TARGETS.Linux64SO, "Linux64 SO") END; OutTargetItem(TARGETS.Win32C, "Windows32 Console"); OutTargetItem(TARGETS.Win32GUI, "Windows32 GUI"); OutTargetItem(TARGETS.Win32DLL, "Windows32 DLL"); OutTargetItem(TARGETS.Linux32, "Linux32 Exec"); OutTargetItem(TARGETS.Linux32SO, "Linux32 SO"); OutTargetItem(TARGETS.KolibriOS, "KolibriOS Exec"); OutTargetItem(TARGETS.KolibriOSDLL, "KolibriOS DLL"); OutTargetItem(TARGETS.MSP430, "MSP430x{1,2}xx microcontrollers"); OutTargetItem(TARGETS.STM32CM3, "STM32 Cortex-M3 microcontrollers"); C.Ln; C.StringLn("optional settings:"); C.Ln; C.StringLn(" -out output"); C.Ln; C.StringLn(" -stk set size of stack in Mbytes (Windows, Linux, KolibriOS)"); C.Ln; C.StringLn(" -nochk <'ptibcwra'> disable runtime checking (pointers, types, indexes,"); C.StringLn(" BYTE, CHR, WCHR)"); C.Ln; C.StringLn(" -ver set version of program (KolibriOS DLL)"); C.Ln; C.StringLn(" -ram set size of RAM in bytes (MSP430) or Kbytes (STM32)"); C.Ln; C.StringLn(" -rom set size of ROM in bytes (MSP430) or Kbytes (STM32)"); C.Ln; UTILS.Exit(0) END; C.StringLn("--------------------------------------------"); PATHS.split(inname, path, modname, ext); IF ext # UTILS.FILE_EXT THEN ERRORS.Error(207) END; IF PATHS.isRelative(path) THEN PATHS.RelPath(app_path, path, temp); path := temp END; UTILS.GetArg(2, param); IF param = "" THEN ERRORS.Error(205) END; IF TARGETS.Select(param) THEN target := TARGETS.target ELSE ERRORS.Error(206) END; IF target = TARGETS.MSP430 THEN options.ram := MSP430.minRAM; options.rom := MSP430.minROM END; IF target = TARGETS.STM32CM3 THEN options.ram := THUMB.STM32_minRAM; options.rom := THUMB.STM32_minROM END; IF UTILS.bit_depth < TARGETS.BitDepth THEN ERRORS.Error(206) END; STRINGS.append(lib_path, "lib"); STRINGS.append(lib_path, UTILS.slash); STRINGS.append(lib_path, TARGETS.LibDir); STRINGS.append(lib_path, UTILS.slash); keys(options, outname); IF outname = "" THEN outname := path; STRINGS.append(outname, modname); STRINGS.append(outname, TARGETS.FileExt) ELSE IF PATHS.isRelative(outname) THEN PATHS.RelPath(app_path, outname, temp); outname := temp END END; PARS.init(options); ST.compile(path, lib_path, modname, outname, target, options); time := UTILS.GetTickCount() - UTILS.time; C.StringLn("--------------------------------------------"); C.Int(PARS.lines); C.String(" lines, "); C.Int(time DIV 100); C.String("."); C.Int2(time MOD 100); C.String(" sec, "); C.Int(WRITER.counter); C.StringLn(" bytes"); UTILS.Exit(0) END main; BEGIN main END Compiler.