summaryrefslogtreecommitdiff
path: root/ParserFace.c
diff options
context:
space:
mode:
authorAsh Wolf <ninji@wuffs.org>2022-10-07 20:02:27 +0100
committerAsh Wolf <ninji@wuffs.org>2022-10-07 20:02:27 +0100
commit97f6a2438df1eaeb4128ce36f29346ea38a3db4a (patch)
tree78260f8f0f2b84fc70fadb1e50e7fc104390eee4 /ParserFace.c
downloadMWCC-97f6a2438df1eaeb4128ce36f29346ea38a3db4a.tar.gz
MWCC-97f6a2438df1eaeb4128ce36f29346ea38a3db4a.zip
first very unfinished commit lol
Diffstat (limited to '')
-rw-r--r--ParserFace.c226
1 files changed, 226 insertions, 0 deletions
diff --git a/ParserFace.c b/ParserFace.c
new file mode 100644
index 0000000..7ce84e5
--- /dev/null
+++ b/ParserFace.c
@@ -0,0 +1,226 @@
+#include "UCWInterface.h"
+
+struct ParseOptsType parseopts;
+
+// TODO move me imports
+extern CWResult CWSecretGetNamedPreferences(CWPluginContext context, const char *name, Handle *pHandle);
+extern CWResult CWParserSetNamedPreferences(CWPluginContext context, const char *name, Handle pHandle);
+extern CWResult CWParserGetCommandLine(CWPluginContext context, CWCommandLineArgs **pArgs);
+extern CWResult CWParserGetToolInfo(CWPluginContext context, struct ToolVersionInfo **pToolVersion);
+extern CWResult CWParserGetTargetInfo(CWPluginContext context, unsigned long *pCpu, unsigned long *pOs);
+extern CWResult CWParserGetPanels(CWPluginContext context, int *pNumPanels, char ***pPanelNames);
+extern CWResult CWParserGetPlugins(CWPluginContext context, int *pNumPlugins, struct CLPluginInfo **pPlugins);
+extern void/*?*/ CWGetPluginRequest(CWPluginContext context, long *request);
+extern void/*?*/ CWDonePluginRequest(CWPluginContext context, CWResult result);
+extern void *pTool;
+extern void SetupParserToolOptions();
+extern void CLPReportError(short code, ...);
+extern unsigned char ParserToolMatchesPlugin(unsigned long plugintype, unsigned long language, unsigned long cpu, unsigned long os);
+extern unsigned char ParserToolHandlesPanels(int numPanels, char **panelNames);
+// TODO move me imports
+
+char *failedCallback;
+
+static CWResult SetupParamBlock(CWPluginContext context) {
+ struct PCmdLineEnvir cle;
+ Handle h;
+ int x;
+ CWResult result;
+
+ memset(&parseopts, 0, sizeof(parseopts));
+ parseopts.context = context;
+
+ result = CWSecretGetNamedPreferences(context, "CmdLine Environment", &h);
+ if (result)
+ return result;
+
+ cle = **((struct PCmdLineEnvir **) h);
+ parseopts.underIDE = cle.underIDE;
+ parseopts.ioRows = cle.rows;
+ parseopts.ioCols = cle.cols;
+
+ result = CWParserGetCommandLine(context, &parseopts.args);
+ if (result)
+ return result;
+
+ result = CWParserGetToolInfo(context, &parseopts.toolVersion);
+ if (result)
+ return result;
+
+ result = CWParserGetTargetInfo(context, &parseopts.cpu, &parseopts.os);
+ if (result)
+ return result;
+
+ result = CWParserGetPanels(context, &parseopts.numPanels, &parseopts.panelNames);
+ if (result)
+ return result;
+
+ result = CWParserGetPlugins(context, &parseopts.numPlugins, &parseopts.plugins);
+ if (result)
+ return result;
+
+ parseopts.passingArgs = 0;
+ for (x = 0; x < parseopts.numPlugins; x++) {
+ if (parseopts.plugins[x].storeCommandLine)
+ parseopts.passingArgs = 1;
+ }
+
+ return 0;
+}
+
+static CWResult SetupOptions(CWPluginContext context) {
+ if (!pTool) {
+ return 2;
+ } else {
+ SetupParserToolOptions();
+ return 0;
+ }
+}
+
+static CWResult Parse(CWPluginContext context) {
+ CWResult result;
+
+ // TODO
+ return result;
+}
+
+Handle Parser_FindPrefPanel(char *name) {
+ Handle h;
+ int idx;
+
+ // TODO pTool
+}
+
+CWResult Parser_StorePanels(CWPluginContext context) {
+ int idx;
+ CWResult result;
+ char *name;
+ Handle h;
+
+ for (idx = 0; idx < parseopts.numPanels; idx++) {
+ name = parseopts.panelNames[idx];
+ h = Parser_FindPrefPanel(name);
+ if (h) {
+ result = CWParserSetNamedPreferences(parseopts.context, name, h);
+ if (result) {
+ CLPReportError(68, name);
+ return result;
+ }
+ }
+ }
+
+ return 0;
+}
+
+static CWResult StoreResults(CWPluginContext context) {
+ // TODO Arg
+}
+
+short CWParser_GetDropInFlags(const DropInFlags **flags, long *flagsSize) {
+ static const DropInFlags sFlags = {
+ kCurrentDropInFlagsVersion,
+ CWFOURCHAR('P','a','r','s'),
+ 7,
+ 0,
+ 'Seep',
+ 12
+ };
+ *flags = &sFlags;
+ *flagsSize = sizeof(sFlags);
+ return 0;
+}
+
+short CWParser_GetDropInName(const char **dropinName) {
+ static const char *sDropInName = "Command-Line Parser";
+ *dropinName = sDropInName;
+ return 0;
+}
+
+short CWParser_GetDisplayName(const char **displayName) {
+ static const char *sDisplayName = "Command-Line Parser";
+ *displayName = sDisplayName;
+ return 0;
+}
+
+short CWParser_GetPanelList(const CWPanelList **panelList) {
+ static const CWPanelList sPanelList = {
+ kCurrentCWFamilyListVersion,
+ 0,
+ 0
+ };
+ *panelList = &sPanelList;
+ return 0;
+}
+
+short CWParser_GetTargetList(const CWTargetList **targetList) {
+ static const unsigned long sCPU = '****';
+ static const unsigned long sOS = '****';
+ static const CWTargetList sTargetList = {
+ kCurrentCWTargetListVersion,
+ 1,
+ &sCPU,
+ 1,
+ &sOS
+ };
+ *targetList = &sTargetList;
+ return 0;
+}
+
+short CWParser_GetVersionInfo(const VersionInfo **versioninfo) {
+ static const VersionInfo vi = {
+ 1, 1, 0, 0
+ };
+ *versioninfo = &vi;
+ return 0;
+}
+
+short Parser_SupportsPlugin(struct CLPluginInfo *pluginfo, CWDataType cpu, CWDataType os, Boolean *isSupported) {
+ *isSupported = ParserToolMatchesPlugin(pluginfo->plugintype, pluginfo->language, cpu, os);
+ return 0;
+}
+
+short Parser_SupportsPanels(int numPanels, char **panelNames, Boolean *isSupported) {
+ *isSupported = ParserToolHandlesPanels(numPanels, panelNames);
+ return 0;
+}
+
+jmp_buf exit_plugin;
+
+short parser_main(CWPluginContext context) {
+ long request;
+ CWResult result;
+
+ CWGetPluginRequest(context, &request);
+ result = setjmp(exit_plugin);
+ if (result == 0) {
+ switch (request) {
+ case reqInitialize:
+ result = 0;
+ break;
+ case 0:
+ break;
+ case 1:
+ result = SetupParamBlock(context);
+ if (!result)
+ result = Parser_StorePanels(context);
+ break;
+ case 2:
+ result = SetupParamBlock(context);
+ if (!result) {
+ result = SetupOptions(context);
+ if (!result) {
+ result = Parse(context);
+ if (!result)
+ result = StoreResults(context);
+ }
+ }
+ break;
+ }
+ } else {
+ if (failedCallback && result != 1)
+ fprintf(stderr, "Unexpected error in %s [%d]\n", failedCallback, result);
+ }
+ CWDonePluginRequest(context, result);
+
+ return result;
+}