⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 toxcc.c

📁 OXCC is a multipass, interpreting C compiler with several language extensions. It generates an Archi
💻 C
字号:
/* TOXCC.C -- test program for running oxcc while being compiled */
/* 
	try:	oxcc -r toxcc.c -TRACE=1 >trace
		  and
		    oxcc -Gb toxcc.c
		    bterp toxcc -TRACE=1 >trace
*/

#include <stdlib.h>
#include <stdio.h>
#include "oxcc.h"

typedef void *object;

extern object Compiler;
extern object String;
extern object File;
extern object stdoutStream;

extern int gSeek();
extern int gPosition();
extern int gGets();
extern void *gNew();
extern void gDispose();
extern int gPrintf();
extern int gPuts();

extern void *oxlink_find_bare_symb();
extern void *oxlink_load_bare_symb();
extern void oxlink_use_library();

static char *testcode =

	"static inline int addfunc(int a, int b)"
	"{"
	"int q;"
		"return a + b;"
	"}"
	"int func(void)"
	"{"
	"int x;"
		"x = addfunc(1,2);"
		"return x;"
	"}";


int toxcc(int argc, char **argv)
{
void *instance;
void *is;		/* input stream */
void *os;		/* output stream */
void *es;		/* error stream */
char buf[200];
int err;

	printf("toxcc: Running\n");

	/* Dynamic link `oxcc' if it is not already there */
	if(!oxlink_find_bare_symb("_oxcc"))
	{
	  oxlink_use_library("oxcc.cff");
	  if(!oxlink_load_bare_symb("_oxcc", 1))
	    {printf("toxcc:ERROR: oxcc load failed\n"); return 1;}
	}
	/* METHOD 1 -- GET AN INSTANCE OF OXCC USING C CALLS */
	printf("toxcc: Method 1, expect a warning for line:1 col:46\n");

	/* 
		NOTE: The global calls to `oxcc_' below may have been unresolved until
		the dynamic linker loaded it above.
	*/
	instance = oxcc_open_instance();

	is = fopen(testcode, "x");	/* open string as a stream (readonly) */
	os = fopen("", "w+UTM");		/* create a Unique Temp file in Memory */
	es = fopen("", "w+UTM");		/* create a Unique Temp file in Memory */

	/* check the input file */
	if(!(err = oxcc_preproc_file(instance, is, os, es, 0, 0)))
	{
	  rewind(os);
	  if((err = oxcc_parse_file(instance, os, es, "testcode")))
	  {
		oxcc_print_parse_errors(instance, es);
	  }
	  else
	  {
		err = oxcc_check_ast_tree(instance, es, "testcode");
	  }
	}
	oxcc_cleanup_parse(instance);

	/* dump accumulated errors and warnings */
	if(ftell(es) > 0)
	{
		rewind(es);
		while(fgets(buf, 199, es))
		  fputs(buf, stdout);
	}
	fclose(is);
	fclose(os);
	fclose(es);
	/* could loop here on a new file */

	oxcc_close_instance(instance);

	/*
		NOTE: Using the class method, the `gNew' function would handle the
		dynamic linking of `oxcc' if it hadn't been loaded above.
	*/
	/* METHOD 2 -- GET AN INSTANCE OF OXCC USING THE CLASS METHOD */
	gPrintf(stdoutStream, "\ntoxcc: Method 2, expect a warning for line:1 col:46\n");

	if(!(instance = gNew(Compiler, "cc")))
	  {gPrintf(stdoutStream, "toxcc:ERROR:oxcc class failed\n"); return 1;}

	is = gNew(String, testcode); /* or could use gNew(File, testcode, "x") */
	os = gNew(File, "", "w+UTM");
	es = gNew(File, "", "w+UTM");

	/* check the input file */
	if(!(err = gPreProc(instance, is, os, es, 0, 0)))
	{
	  gSeek(os, 0);
	  if((err = gParse(instance, os, es, "testcode")))
	  {
		gPerror(instance, es);
	  }
	  else
	  {
		err = gCheckTree(instance, es, "testcode");
	  }
	}
	gCleanup(instance);

	/* dump accumulated errors and warnings */
	if(gPosition(es) > 0)
	{
		gSeek(es, 0);
		while(gGets(es, buf, 199))
		  gPuts(stdoutStream, buf);
	}
	gDispose(is);
	gDispose(os);
	gDispose(es);
	/* could loop here on a new file */

	gDispose(instance);
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -