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

📄 outgen.c

📁 一款拥有一定历史的C语言编译器
💻 C
字号:
/*      o u t g e n . c * C compiler * ========== * * Copyright 1989, 1990, 1991 Christoph van Wuellen. * Credits to Matthew Brandt. * All commercial rights reserved. * * This compiler may be redistributed as long there is no * commercial interest. The compiler must not be redistributed * without its full sources. This notice must stay intact. * * History: * * 1989   starting an 68000 C compiler, starting with material *        originally by M. Brandt * 1990   68000 C compiler further bug fixes *        started i386 port (December) * 1991   i386 port finished (January) *        further corrections in the front end and in the 68000 *        code generator. *        The next port will be a SPARC port *//****************************************************************************** * * This module contains code generation routines that are common to * both 68k and 386 processors, and also to all target assembler * types. * * Previously these routines were repeasted in all of the following * modules: *              out386_bas.c *              out386_gas.c *              out68k_ack.c *              out68k_cpm.c *              out68k_gas.c *****************************************************************************/#include "chdr.h"#ifdef CPU_DEFINED#include "expr.h"#include "cglbdec.h"#include "proto.h"/* * This module can be set up to prepend underscores to the * names shipped out by this module. * Names starting with a dot are not translated, theses are * compiler support functions which should not fall in the * user's namespace * * Capable of translating symbol names before output, since external * symbols are truncated to eight characters adopt the algorithm used in * ,,scanaout'' *//*****************************************************************************/const CHAR *outlate P1 (const CHAR *, string){    static CHAR symname[MAX_ID_LEN + 1];    const CHAR *sp;    CHAR   *dp;#ifdef TRANSLATE    int     k;#endif /* TRANSLATE */    dp = (CHAR *) &symname[0];    if (*string == (CHAR) '.') {#ifdef TRANSLATE	if (!trans_option) {	    return string;	}	/* delete the leading '.' which mucks things up here!! */	sp = &string[1];#else	return string;#endif /* TRANSLATE */    } else {	sp = external_prefix;	while (*sp) {	    *dp++ = (CHAR) *sp++;	};	sp = string;    }    while ((*dp++ = (CHAR) *sp++) != (CHAR) 0)
	continue;#ifdef TRANSLATE    if (trans_option && ((k = (int) strlen ((char *) symname)) > 8)) {	/*	 * translate long symbol name to 8 chars 140603: big prime number	 * smaller than 52**3 This is for defective assemblers/linkers that	 * can only handle external names which are 8 chars wide, this may	 * help if you have problems with different identifiers not	 * being different in the first 7 (seven, due to the leading	 * underscore) characters	 *	 * THIS IS UGLY, BUT IT IT THE LAST RESORT, AND IT HELPED ME IN SOME	 * CASES. TRANS_OPTION IS *NOT* THE DEFAULT	 */	unsigned long check;	int     j;	check = (unsigned long) 0;	for (j = 0; j < k; j++)	    check =		(check + check +		 (unsigned long) symname[j]) % (unsigned long) 140603L;	j = (int) (check % (unsigned long) 52);	check = check / (unsigned long) 52;	symname[0] = (CHAR) ((j < 26) ? 'a' + j : 'A' + j - 26);	j = (int) (check % (unsigned long) 52);	check = check / (unsigned long) 52;	symname[1] = (CHAR) ((j < 26) ? 'a' + j : 'A' + j - 26);	j = (int) (check % (unsigned long) 52);	symname[2] = (CHAR) ((j < 26) ? 'a' + j : 'A' + j - 26);	symname[8] = (CHAR) '\0';    }#endif /* TRANSLATE */    return symname;}#endif /* CPU_DEFINED */

⌨️ 快捷键说明

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