MWCC/includes/parser.h

448 lines
17 KiB
C
Raw Permalink Normal View History

#pragma once
#include "cw_common.h"
#include "pref_structs.h"
#include "option_system.h"
enum {
PRAGMA_FLAGS_0,
PRAGMA_FLAGS_1
};
enum {
PR_UNSET = 0, // this is the only one we know the name of (from asserts)
PR_ON = 1,
PR_OFF = 2,
PR_AUTO = 3,
PR_RESET = 4
};
typedef struct {
void *value;
const char *pragma;
int flags;
} Pragma; // assumed name
enum {
2023-01-15 21:50:41 +00:00
// "Option missing"
CLPStr1 = 1,
2023-01-15 21:50:41 +00:00
// "Command-line argument '%.15s...%.15s' is much too long, maximum accepted length is %d characters"
CLPStr2 = 2,
2023-01-15 21:50:41 +00:00
// "Parameter for '%s' missing"
CLPStr3 = 3,
2023-01-15 21:50:41 +00:00
// "Numeric constant '%s' overflowed 32-bit range"
CLPStr4 = 4,
2023-01-15 21:50:41 +00:00
// "Invalid %sconstant '%s'"
CLPStr5 = 5,
2023-01-15 21:50:41 +00:00
// "Numeric constant %lu is out of the legal range %lu - %lu"
CLPStr6 = 6,
2023-01-15 21:50:41 +00:00
// "Numeric constant %lu is out of the legal range %lu - %lu; clipping to %lu"
CLPStr7 = 7,
2023-01-15 21:50:41 +00:00
// "Four-char type '%s' is too long, expected maximum four characters"
CLPStr8 = 8,
2023-01-15 21:50:41 +00:00
// "String constant '%.16s...%.16s' too long, expected maximum %ld characters"
CLPStr9 = 9,
2023-01-15 21:50:41 +00:00
// "Identifier '%s' cannot start with a digit"
CLPStr10 = 10,
2023-01-15 21:50:41 +00:00
// "Identifier '%s' cannot contain the character '%c'"
CLPStr11 = 11,
2023-01-15 21:50:41 +00:00
// "Expected 'on' or 'off', but got '%s'"
CLPStr12 = 12,
2023-01-15 21:50:41 +00:00
// "Filename or directory '...%32s' is too long, expected maximum %ld characters"
CLPStr13 = 13,
2023-01-15 21:50:41 +00:00
// "Directory '...%32s' combined with filename '...%32s' is too long, maximum path is %ld characters"
CLPStr14 = 14,
2023-01-15 21:50:41 +00:00
// "File '%s' does not exist"
CLPStr15 = 15,
2023-01-15 21:50:41 +00:00
// "'%s' is a directory or volume, filename expected"
CLPStr16 = 16,
2023-01-15 21:50:41 +00:00
// "'%s' does not refer to a directory"
CLPStr17 = 17,
2023-01-15 21:50:41 +00:00
// "File path '%s' not accepted\n(%s)"
CLPStr18 = 18,
2023-01-15 21:50:41 +00:00
// "Unknown option '%s'"
CLPStr19_UnknownOptionX = 19,
2023-01-15 21:50:41 +00:00
// "Unknown option '%s'; expected one of '%s'"
CLPStr20_UnknownOptionX_ExpectedOneOfX = 20,
2023-01-15 21:50:41 +00:00
// "Option is obsolete"
CLPStr21_OptionObsolete = 21,
2023-01-15 21:50:41 +00:00
// "Option is obsolete; %s"
CLPStr22_OptionObsoleteWithHelp = 22,
2023-01-15 21:50:41 +00:00
// "Option '%s' substituted with %s"
CLPStr23_OptionXSubstitutedWithX = 23,
2023-01-15 21:50:41 +00:00
// "Option deprecated; accepted this time"
CLPStr24_OptionDeprecated = 24,
2023-01-15 21:50:41 +00:00
// "Option deprecated, accepted this time; use '%s' instead"
CLPStr25_OptionDeprecatedWithHelp = 25,
2023-01-15 21:50:41 +00:00
// "Option ignored"
CLPStr26_OptionIgnored = 26,
2023-01-15 21:50:41 +00:00
// "Option ignored;\n%s"
CLPStr27_OptionIgnoredWithText = 27,
2023-01-15 21:50:41 +00:00
// "%s"
CLPStr28_WarningText = 28,
2023-01-15 21:50:41 +00:00
// "Option has no effect on this target"
CLPStr29_OptionHasNoEffect = 29,
2023-01-15 21:50:41 +00:00
// "Option should not be specified multiple times"
CLPStr30_OptionShouldNotBeSpecifiedMultipleTimes = 30,
2023-01-15 21:50:41 +00:00
// "Option overrides the effect of '%s'; only one of '%s' should be specified"
CLPStr31_OptionOverridesEffect = 31,
2023-01-15 21:50:41 +00:00
// "Option overrides the effect of '%s'; only one of '%s' should be specified;\n%s"
CLPStr32_OptionOverridesEffectWithHelp = 32,
2023-01-15 21:50:41 +00:00
// "No default handler set up for '%s', ignoring"
CLPStr33_NoDefaultHandlerSetUpForX_Ignoring = 33,
2023-01-15 21:50:41 +00:00
// "Argument(s) expected"
CLPStr34_ArgumentsExpected = 34,
2023-01-15 21:50:41 +00:00
// "Token '%s' not expected"
CLPStr35_TokenXNotExpected = 35,
2023-01-15 21:50:41 +00:00
// "Unexpected additional argument '%s'"
CLPStr36_UnexpectedAdditionalArgumentX = 36,
2023-01-15 21:50:41 +00:00
// "Encountered extraneous arguments"
CLPStr37 = 37,
2023-01-15 21:50:41 +00:00
// "No help available for option '%s'"
CLPStr38_NoHelpAvailableForOptionX = 38,
2023-01-15 21:50:41 +00:00
// "Empty (zero-length) argument not accepted"
CLPStr39 = 39,
2023-01-15 21:50:41 +00:00
// "Variable name missing"
CLPStr40 = 40,
2023-01-15 21:50:41 +00:00
// "Only one output filename allowed; '%s' not accepted"
CLPStr41 = 41,
2023-01-15 21:50:41 +00:00
// "Output filenames found without source; '%s' not accepted"
CLPStr42 = 42,
2023-01-15 21:50:41 +00:00
// "Multiple outputs expected, output is ambiguous; '%s' not accepted"
CLPStr43 = 43,
2023-01-15 21:50:41 +00:00
// "Specified file '%s' not found"
CLPStr44 = 44,
2023-01-15 21:50:41 +00:00
// "Specified directory '%s' not found"
CLPStr45 = 45,
2023-01-15 21:50:41 +00:00
// "'%s' is a filename, not a directory; not accepted"
CLPStr46 = 46,
2023-01-15 21:50:41 +00:00
// "'%s' is a directory, not a filename; not accepted"
CLPStr47 = 47,
2023-01-15 21:50:41 +00:00
// "Library search found shared library '%s' instead of export library '%s.LIB'"
CLPStr48 = 48,
2023-01-15 21:50:41 +00:00
// "No library file found matching 'lib%s{%s}' or '%s'"
CLPStr49 = 49,
2023-01-15 21:50:41 +00:00
// "Redudant use of '%c%s%s'; linker always searches library paths;\ntypically one finds, e.g., libXXX.a with '%c%sXXX'"
CLPStr50 = 50,
2023-01-15 21:50:41 +00:00
// "Empty filename in library list ignored"
CLPStr51 = 51,
2023-01-15 21:50:41 +00:00
// "Environment variable '%s' not found"
CLPStr52 = 52,
2023-01-15 21:50:41 +00:00
// "In environment variable '%s':"
CLPStr53 = 53,
2023-01-15 21:50:41 +00:00
// "Option name expected for 'opt'"
CLPStr54 = 54,
2023-01-15 21:50:41 +00:00
// "Token '%s' ignored"
CLPStr55 = 55,
2023-01-15 21:50:41 +00:00
// "Token '%s[...%s]' was truncated to %d characters"
CLPStr56 = 56,
2023-01-15 21:50:41 +00:00
// "Expected %s, but got %s"
CLPStr57 = 57,
2023-01-15 21:50:41 +00:00
// "No output expected from this process, ignoring output name '%s'"
CLPStr58 = 58,
2023-01-15 21:50:41 +00:00
// "Only one output directory allowed, '%s' not accepted"
CLPStr59 = 59,
2023-01-15 21:50:41 +00:00
// "Storing browse info for '%s' in '%s'"
CLPStr60 = 60,
2023-01-15 21:50:41 +00:00
// "All linker output will be created in the same directory; ignoring path for '%s'"
CLPStr61 = 61,
2023-01-15 21:50:41 +00:00
// "Option overrides previously specified optimizations"
CLPStr62 = 62,
2023-01-15 21:50:41 +00:00
// "Could not initialize command line parser"
CLPStr63 = 63,
2023-01-15 21:50:41 +00:00
// "Output filename '%s' is invalid"
CLPStr64 = 64,
2023-01-15 21:50:41 +00:00
// "Truncated output filename '%s' to %d characters"
CLPStr65 = 65,
2023-01-15 21:50:41 +00:00
// "Output directory '%s' cannot be found"
CLPStr66 = 66,
2023-01-15 21:50:41 +00:00
// "Cannot add access path '%s'"
CLPStr67 = 67,
2023-01-15 21:50:41 +00:00
// "Cannot set preferences for '%s'"
CLPStr68 = 68,
2023-01-15 21:50:41 +00:00
// "Some of the files specified could not be found; build aborted"
CLPStr69 = 69,
2023-01-15 21:50:41 +00:00
// "Nothing to do: no source or object files specified"
CLPStr70 = 70,
2023-01-15 21:50:41 +00:00
// "Contents of %s:"
CLPStr71 = 71,
2023-01-15 21:50:41 +00:00
// "Overlays not supported on this target"
CLPStr72 = 72,
2023-01-15 21:50:41 +00:00
// "Segments not supported on this target"
CLPStr73 = 73,
2023-01-15 21:50:41 +00:00
// "Cannot open %s file '%s'"
CLPStr74 = 74,
2023-01-15 21:50:41 +00:00
// ""
CLPStr75 = 75,
2023-01-15 21:50:41 +00:00
// "The file \"%s\" may be ignored unless it has one of the following\nextensions: \"%s\""
CLPStr76 = 76,
2023-01-15 21:50:41 +00:00
// "Not using non-text file '%s' as optional argument"
CLPStr77 = 77,
2023-01-15 21:50:41 +00:00
// "Cannot redirect stream to '%s' (%s)"
CLPStr78 = 78
};
// State
typedef struct {
char *name;
void *ptr;
SInt32 size;
} PrefDataPanel; // assumed name
typedef struct {
OSType TYPE;
OSType LANG;
OSType CPU;
OSType OS;
int numPrefPanels;
char **prefPanels;
char *toolInfo;
char *copyright;
int numOptionLists;
OptionList **optionLists;
int numPrefDataPanels;
PrefDataPanel *prefDataPanels;
2023-01-11 22:29:53 +00:00
int (*PreParse)(void);
int (*MidParse)(void);
int (*PostParse)(void);
} ParserTool; // assumed name
typedef struct {
struct CWPluginPrivateContext *context;
char helpKey[64];
SInt32 helpFlags;
UInt16 ioCols;
UInt16 ioRows;
CWCommandLineArgs *args;
const ToolVersionInfo *toolVersion;
int numPlugins;
const CLPluginInfo *plugins;
int numPanels;
const char **panelNames;
OSType cpu;
OSType os;
char lastoutputname[256];
SInt32 currentSegment;
SInt32 currentOverlayGroup;
SInt32 currentOverlay;
int possibleFiles;
int userSpecifiedFiles;
int unusedFiles;
Boolean hadAnyOutput;
Boolean hadErrors;
Boolean showHelp;
Boolean underIDE;
Boolean alwaysUsePaths;
Boolean noOptions;
Boolean printedVersion;
Boolean passingArgs;
Boolean disToFile;
Boolean ppToFile;
Boolean initBefore;
Boolean weakImport;
Boolean mergeIntoOutput;
Boolean success;
Boolean ignoreUnknown;
UInt8 unused[2];
} ParseOptsType; // assumed name
#ifdef __cplusplus
extern "C" {
#endif
/********************************/
/* IO.c */
extern void ShowTextHandle(const char *description, Handle text);
extern void ShowVersion(Boolean decorate);
/********************************/
/* OptimizerHelpers.c */
extern Pragma irPragmas[];
extern int SetPragmaOptimizationsToUnspecified(const char *opt, void *, const char *, int);
extern int SetOptFlags(const char *opt, void *str, const char *, int flags);
2023-01-11 22:29:53 +00:00
extern int DisplayOptimizationOptions(const char *, void *, const char *, int);
/********************************/
/* ParserErrors.c */
extern void CLPReportError_V(const char *format, va_list ap);
extern void CLPReportWarning_V(const char *format, va_list ap);
extern void CLPReport_V(const char *format, va_list ap);
extern void CLPStatus_V(const char *format, va_list ap);
extern void CLPAlert_V(const char *format, va_list ap);
extern void CLPOSAlert_V(const char *format, SInt32 err, va_list ap);
extern char *CLPGetErrorString(SInt16 errid, char *buffer);
extern void CLPReportError(SInt16 errid, ...);
extern void CLPReportWarning(SInt16 errid, ...);
extern void CLPReport(SInt16 errid, ...);
extern void CLPAlert(SInt16 errid, ...);
extern void CLPOSAlert(SInt16 errid, SInt16 err, ...);
extern void CLPProgress(SInt16 errid, ...);
extern void CLPStatus(SInt16 errid, ...);
extern void CLPFatalError(const char *format, ...);
/********************************/
/* ParserFace.c */
extern const char *failedCallback;
extern jmp_buf exit_plugin;
extern ParseOptsType parseopts;
extern Handle Parser_FindPrefPanel(const char *name);
extern SInt32 Parser_StorePanels(struct CWPluginPrivateContext *context);
extern CWPLUGIN_ENTRY (CWParser_GetDropInFlags)(const DropInFlags **flags, SInt32 *flagsSize);
extern CWPLUGIN_ENTRY (CWParser_GetDropInName)(const char **dropinName);
extern CWPLUGIN_ENTRY (CWParser_GetDisplayName)(const char **displayName);
extern CWPLUGIN_ENTRY (CWParser_GetPanelList)(const CWPanelList **panelList);
extern CWPLUGIN_ENTRY (CWParser_GetTargetList)(const CWTargetList **targetList);
extern CWPLUGIN_ENTRY (CWParser_GetVersionInfo)(const VersionInfo **versioninfo);
extern CWPLUGIN_ENTRY (Parser_SupportsPlugin)(const struct CLPluginInfo *pluginfo, OSType cpu, OSType os, Boolean *isSupported);
extern CWPLUGIN_ENTRY (Parser_SupportsPanels)(int numPanels, const char **panelNames, Boolean *isSupported);
extern CWPLUGIN_ENTRY (parser_main)(struct CWPluginPrivateContext *context);
/********************************/
/* ParserGlue-mach-ppc-c.c */
extern PCmdLine pCmdLine;
extern PCmdLineCompiler pCmdLineCompiler;
extern PCmdLineLinker pCmdLineLinker;
extern PFrontEndC pFrontEndC;
extern PWarningC pWarningC;
extern PGlobalOptimizer pGlobalOptimizer;
extern PBackEnd pBackEnd;
extern PDisassembler pDisassembler;
extern PMachOLinker pLinker;
extern PMachOProject pMachOProject;
extern PCLTExtras pCLTExtras;
/********************************/
/* ParserHelpers.c */
extern SInt16 lastStage;
extern Boolean dashIMinusMovesPaths;
extern Boolean usedDashIMinus;
extern Boolean namingSysPaths;
extern int FindFileInPath(const char *filename, OSSpec *fss);
extern char *GetEnvVar(const char *name, Boolean warn, const char **match);
extern int Opt_AddAccessPath(const char *opt, void *var, const char *arg, int flags);
extern int Opt_AddFrameworkPath(const char *opt, void *var, const char *arg, int flags);
extern int Opt_AddFramework(const char *opt, void *var, const char *arg, int flags);
extern void ListParseMessage(void (*errprint)(const char *, va_list), const char *envvar, SInt16 id, ...);
extern int AddAccessPathList(const char *list, char sep1, char sep2, int source, char *text, Boolean system, SInt32 position, Boolean recursive);
extern int Opt_FindAndAddFile(const char *opt, void *var, const char *arg, int flags);
extern int Opt_FindAndAddFileRef(const char *opt, void *var, const char *arg);
extern int Opt_AddUnixLibraryFile(const char *opt, void *var, const char *arg);
extern int AddFileList(const char *list, char sep1, char sep2, int source, char *text, SInt32 position);
extern int IsFileInOutputDirectory(const OSSpec *file);
extern void GetCFileNameInOutputDirectory(const char *input, char *name, int maxlen);
extern void GetPFileNameInOutputDirectory(const char *input, unsigned char *name, int len);
extern void AddStringLenToHandle(Handle *h, const char *str, int len);
extern void AddStringToHandle(Handle *h, const char *str);
extern int Opt_PrintVersion(const char *opt, void *var, const char *arg, int flags);
extern void GetFirstSourceFilenameBase(char *buffer, char *defaul);
extern int Opt_SavePrefs(const char *opt, void *var, const char *arg, int flags);
extern int ParseNumber(const char *arg, Boolean emit_error, SInt32 *ret, const char **endptr);
extern int Opt_MaybeMoveAccessPaths(const char *opt, void *var, const char *arg, int flags);
/********************************/
/* ParserHelpers-cc.c */
extern Handle definesHandle;
extern int Opt_AddStringToDefines(const char *opt, void *str, const char *param, int flags);
extern int Opt_DefineSymbol(const char *var, const char *value);
extern int Opt_UndefineSymbol(const char *opt, void *, const char *arg, int flags);
extern int Opt_AddPrefixFile(const char *opt, void *handle, const char *filename, int flags);
extern int Opt_PragmaTrueFalse(const char *, void *flag, const char *, int flags);
extern int Opt_PragmaFalseTrue(const char *, void *flag, const char *, int flags);
extern int Opt_PragmaOnOff(const char *, void *flag, const char *arg);
extern int Opt_PragmaOffOn(const char *, void *flag, const char *arg);
extern int SetupPragmas(const Pragma *pragmas);
/********************************/
/* Projects.c */
2023-01-11 22:29:53 +00:00
extern int GetFileCount(void);
extern void SetFileOutputName(SInt32 position, SInt16 which, char *outfilename);
extern int AddFileToProject(OSSpec *oss, SInt16 which, char *outfilename, Boolean exists, SInt32 position);
extern Boolean GetFileInfo(SInt32 position, OSSpec *spec, char *plugin);
extern int AddAccessPath(OSPathSpec *oss, SInt16 type, SInt32 position, Boolean recursive);
2023-01-11 22:29:53 +00:00
extern int MoveSystemPathsIntoUserList(void);
extern void AddVirtualFile(const char *filename, Handle *text);
extern void GetOutputFileDirectory(OSPathSpec *dir);
extern void SetOutputFileDirectory(OSPathSpec *dir);
extern void AddOverlayGroup(const char *name, CWAddr64 *addr, SInt32 *groupnum, SInt32 *overlaynum);
extern void AddOverlay(SInt32 groupnum, const char *name, SInt32 *overlaynum);
extern void AddSegment(const char *name, SInt16 attrs, SInt32 *segmentnum);
extern void ChangeSegment(SInt32 segmentnum, const char *name, SInt16 attrs);
extern int GetSegment(SInt32 segmentnum, char *name, SInt16 *attrs);
/********************************/
/* TargetOptimizer-ppc-mach.c */
extern char schedule_ppc_default;
extern int TargetSetOptFlags(short val, Boolean set);
extern void TargetDisplayOptimizationOptions(Handle txt);
2023-01-11 22:29:53 +00:00
extern void TargetSetPragmaOptimizationsToUnspecified(void);
/********************************/
/* TargetWarningHelpers-ppc-cc.c */
extern Pragma warningPragmas[];
extern int TargetSetWarningFlags(short val, Boolean set);
extern void TargetDisplayWarningOptions(Handle txt);
/********************************/
/* Targets.c */
extern ParserTool *pTool;
extern int SetParserToolInfo(ParserTool *tool);
extern Boolean ParserToolMatchesPlugin(OSType type, OSType lang, OSType cpu, OSType os);
extern Boolean ParserToolHandlesPanels(int numPanels, const char **panelNames);
2023-01-11 22:29:53 +00:00
extern Boolean SetupParserToolOptions(void);
/********************************/
/* ToolHelpers.c */
enum {
OutputOrdering0 = 0,
OutputOrdering1 = 1,
OutputOrdering2 = 2
};
extern char linkerOutputFilename[256];
extern Boolean setLinkerOutputFilename;
extern Boolean setOutputDirectory;
extern SInt16 outputOrdering;
extern int Opt_HandleOutputName(const char *opt, void *, const char *filename, int flags);
extern int ValidateToolState(Boolean mustHaveFiles);
extern void ToolReportMessage(SInt16 errid, SInt16 type, va_list va);
extern void ToolReportWarning(SInt16 id, ...);
extern void ToolReportError(SInt16 id, ...);
extern void ToolReportOSError(SInt16 id, int err, ...);
extern void ToolReportInfo(SInt16 id, ...);
extern int Opt_DoNotLink(const char *opt, void *var, const char *arg);
extern int Opt_IncreaseVerbosity(const char *opt, void *var, const char *arg, int flags);
extern int Opt_SetStage(const char *opt, void *str, const char *arg, int flags);
extern int Opt_RedirectStream(const char *opt, void *file, const char *filename);
/********************************/
/* ToolHelpers-cc.c */
extern int Opt_DummyLinkerRoutine(const char *opt, void *, const char *, int);
extern int Opt_DummyLinkerSettingRoutine(const char *var, const char *val);
2023-01-11 22:29:53 +00:00
extern void FinishCompilerTool(void);
/********************************/
/* Utils.c */
extern int my_tolower(char c);
extern int my_isdigit(char c);
extern int my_isalpha(char c);
extern int my_isalnum(char c);
extern int my_isxdigit(char c);
extern char *Utils_SpellList(char *list, char *buffer, char opts);
extern int Utils_CompareOptionString(const char *a, const char *b, int cased, int sticky);
/********************************/
/* WarningHelpers.c */
extern int SetWarningFlags(const char *opt, void *str, const char *, int flags);
2023-01-11 22:29:53 +00:00
extern int DisplayWarningOptions(const char *, void *, const char *, int);
#ifdef __cplusplus
extern "C" }
#endif