资源简介
一个c语言编译器源码,由C语言编写。能成功编译自身。是学习编译器开发的好资源。
代码片段和文件信息
#include
#include
#include
#include “ucc.h“
#define _P_WAIT 0
#define UCCDIR “/usr/local/lib/ucc/“
static char *CPPProg[] =
{
“/usr/bin/gcc“ “-U__GNUC__“ “-D_POSIX_SOURCE“ “-D__STRICT_ANSI__“
“-Dunix“ “-Di386“ “-Dlinux“ “-D__unix__“ “-D__i386__“ “-D__linux__“
“-D__signed__=signed“ “-D_UCC“ “-I“ UCCDIR “include“ “$1“ “-E“ “$2“ “-o“ “$3“ 0
};
static char *CCProg[] =
{
UCCDIR “ucl“ “-ext:.s“ “$1“ “$2“ 0
};
static char *ASProg[] =
{
“/usr/bin/as“ “-o“ “$3“ “$1“ “$2“ 0
};
static char *LDProg[] =
{
“/usr/bin/gcc“ “-o“ “$3“ “$1“ “$2“ UCCDIR “assert.o“ “-lc“ “-lm“ 0
};
char *ExtNames[] = { “.c“ “.i“ “.s“ “.o“ “.a;.so“ 0 };
static int Execute(char **cmd)
{
int pid n status;
pid = fork();
if (pid == -1)
{
fprintf(stderr “no more processes\n“);
return 100;
}
else if (pid == 0)
{
execv(cmd[0] cmd);
perror(cmd[0]);
fflush(stdout);
exit(100);
}
while ((n = wait(&status)) != pid && n != -1)
;
if (n == -1)
status = -1;
if (status & 0xff)
{
fprintf(stderr “fatal error in %s\n“ cmd[0]);
status |= 0x100;
}
return (status >> 8) & 0xff;
}
void SetupToolChain(void)
{
}
int InvokeProgram(int oftype)
{
List p il ol;
char *ofname;
char **cmd;
int status = 0;
switch (oftype)
{
case PP_FILE:
for (p = Option.cfiles; p != NULL; p = p->next)
{
ofname = FileName(p->str “.i“);
PPFiles = ListAppend(PPFiles ofname);
il = ListAppend(NULL p->str);
ol = ListAppend(NULL ofname);
cmd = BuildCommand(CPPProg Option.pflags il ol);
status = Execute(cmd);
}
Option.pfiles = ListCombine(Option.pfiles PPFiles);
break;
case ASM_FILE:
if (Option.pfiles == NULL)
return 0;
for (p = Option.aflags Option.aflags = NULL; p != NULL; p = p->next)
{
Option.aflags = ListCombine(Option.aflags ParseOption(p->str + 4));
}
for (p = Option.pfiles; p != NULL; p = p->next)
{
ASMFiles = ListAppend(ASMFiles FileName(p->str “.s“));
}
Option.afiles = ListCombine(Option.afiles ASMFiles);
cmd = BuildCommand(CCProg Option.cflags Option.pfiles ASMFiles);
status = Execute(cmd);
break;
case OBJ_FILE:
for (p = Option.afiles; p != NULL; p = p->next)
{
ofname = FileName(p->str “.o“);
OBJFiles = ListAppend(OBJFiles ofname);
il = ListAppend(NULL p->str);
ol = ListAppend(NULL ofname);
cmd = BuildCommand(ASProg Option.aflags il ol);
status = Execute(cmd);
}
Option.ofiles = ListCombine(Option.ofiles OBJFiles);
break;
case LIB_FILE:
return 0;
case EXE_FILE:
if (Option.ofiles == NULL)
return 0;
if (Option.out == NULL)
Option.out = “a.out“;
cmd = BuildCommand(LDProg Option.lflags Option.linput ListAppend(NULL Option.out));
status = Execute(cmd);
break;
}
return status;
}
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 463 2008-06-16 14:36 ucc162\ucc\ChangeLog
文件 69 2008-11-21 18:22 ucc162\ucc\COPYRIGHT
文件 162 2008-11-10 16:16 ucc162\ucc\COPYRIGHT~
文件 227013 2008-05-14 11:13 ucc162\ucc\doc\UC Internal(chn).pdf
文件 137607 2008-05-14 11:13 ucc162\ucc\doc\UCC Internal.pdf
文件 4319 2008-05-14 11:13 ucc162\ucc\doc\UCC User Manual(chn).txt
文件 5938 2008-05-14 11:13 ucc162\ucc\doc\UCC User Manual.txt
文件 2955 2008-05-14 11:13 ucc162\ucc\driver\linux.c
文件 115 2008-05-14 11:13 ucc162\ucc\driver\Makefile
文件 175 2008-05-14 11:13 ucc162\ucc\driver\Makefile.win
文件 7261 2008-05-14 11:13 ucc162\ucc\driver\ucc.c
文件 845 2008-05-14 11:13 ucc162\ucc\driver\ucc.h
文件 3274 2008-05-14 11:13 ucc162\ucc\driver\win32.c
文件 17719 2007-08-28 22:31 ucc162\ucc\GPL.txt
文件 292 2008-05-14 11:13 ucc162\ucc\Makefile
文件 385 2008-05-14 11:13 ucc162\ucc\Makefile.win
文件 157 2008-05-14 11:13 ucc162\ucc\REAMDE.txt
文件 1822 2008-06-06 10:07 ucc162\ucc\ucl\alloc.c
文件 577 2008-05-14 11:12 ucc162\ucc\ucl\alloc.h
文件 389 2008-06-10 14:46 ucc162\ucc\ucl\assert.c
文件 1223 2008-06-10 14:46 ucc162\ucc\ucl\ast.c
文件 2570 2008-05-14 11:12 ucc162\ucc\ucl\ast.h
文件 417 2008-05-14 11:12 ucc162\ucc\ucl\config.h
文件 22643 2008-06-06 13:46 ucc162\ucc\ucl\decl.c
文件 3209 2008-05-14 11:12 ucc162\ucc\ucl\decl.h
文件 29697 2008-06-06 13:52 ucc162\ucc\ucl\declchk.c
文件 8037 2008-05-14 11:12 ucc162\ucc\ucl\dumpast.c
文件 3672 2008-06-06 14:34 ucc162\ucc\ucl\emit.c
文件 812 2008-05-14 11:12 ucc162\ucc\ucl\error.c
文件 196 2008-05-14 11:12 ucc162\ucc\ucl\error.h
............此处省略62个文件信息
- 上一篇:定时器设计的门铃C语言源码
- 下一篇:Forstner点特征提取源文件,C++版本
相关资源
- 北京化工大学计算方法(C/C++)讲义
- GBT 28169-2011 嵌入式软件 C语言编码规范
- XUnZip Zip解压缩.rar
- Windows_API_函数大全 C/C++
- C语言程序设计教材习题参考答案.do
- 基于MFC的VC++仿QQ浏览器源码(雏形)
- 高效FFT的C/C++代码实现包括基2的DIF和
- c/c++开发网络验证和本地验证
- 操作系统存储管理实验报告c/c++
- C++编写的万年历源码
- C语言进阶源码---基于graphics实现图书
- 井字棋三连棋的AI实现,C/C++
- 《水果忍者》设计报告.doc
- MFC实现的红绿灯程序
- Win32简易画图程序
- C++网络爬虫项目
- 泡泡堂(炸弹人)小游戏C/C++完整源码
- 使用C/C++读取BITMAP的内容
- VC图像处理-用Canny算子提取边缘
- C/C++视频教程
- 个人总结的一些C/C++编码规范
- 高斯消去法求解线性方程组C/C++程序输
- celrityC/C++源码查看工具
- 网络编程MFC 实验四 FTP客户端功能实现
- C/C++语言大作业、小游戏
- 完整的C/C++时序的B+树数据库系统实现
- Eclipse C/C++ 自动补全的cdt补丁
- MongoDB C/C++开发使用案例Demo
- C/C++使用WinIO读取CMOS数据代码
- Diab C/C++ Compiler for PowerPC
评论
共有 条评论