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

📄 print.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
字号:
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <math.h>#include <ctype.h>#include "grap.h"#include "y.tab.h"double	margin	= MARGIN;	/* extra space around edges */extern	double	frame_ht, frame_wid, ticklen;extern int just, sizeop, tick_dir;extern double sizexpr, lab_up, lab_rt;char	graphname[50] = "Graph";char	graphpos[200] = "";void print(void)	/* arrange final output */{	FILE *fd;	Obj *p, *dfp;	int c;	double dx, dy, xfac, yfac;	if (tfd != NULL) {		fclose(tfd);	/* end the temp file */		tfd = stdout;	}	if ((p=lookup("margin",0)) != NULL)		margin = p->fval;	if (frame_ht < 0)	/* wasn't set explicitly, so use default */		frame_ht = getvar(lookup("frameht", 0));	if (frame_wid < 0)		frame_wid = getvar(lookup("framewid", 0));	dfp = NULL;	for (p = objlist; p; p = p->next) {		dprintf("print: name = <%s>, type = %d\n", p->name, p->type);		if (p->type == NAME) {			Point pt, pt1;				pt = p->pt;			pt1 = p->pt1;			fprintf(tfd, "\t# %s %g .. %g, %g .. %g\n",				p->name, pt.x, pt1.x, pt.y, pt1.y);			if (p->log & XFLAG) {				if (pt.x <= 0.0)					ERROR "can't take log of x coord %g", pt.x FATAL;				logit(pt.x);				logit(pt1.x);			}			if (p->log & YFLAG) {				if (pt.y <= 0.0)					ERROR "can't take log of y coord %g", pt.y FATAL;				logit(pt.y);				logit(pt1.y);			}			if (!(p->coord & XFLAG)) {				dx = pt1.x - pt.x;				pt.x -= margin * dx;				pt1.x += margin * dx;			}			if (!(p->coord & YFLAG)) {				dy = pt1.y - pt.y;				pt.y -= margin * dy;				pt1.y += margin * dy;			}			if (autoticks && strcmp(p->name, dflt_coord) == 0) {				p->pt = pt;				p->pt1 = pt1;				if (p->log & XFLAG) {					p->pt.x = pow(10.0, pt.x);					p->pt1.x = pow(10.0, pt1.x);				}				if (p->log & YFLAG) {					p->pt.y = pow(10.0, pt.y);					p->pt1.y = pow(10.0, pt1.y);				}				dfp = setauto();			}					dx = pt1.x - pt.x;			dy = pt1.y - pt.y;			xfac = dx > 0 ? frame_wid/dx : frame_wid/2;			yfac = dy > 0 ? frame_ht/dy : frame_ht/2;			fprintf(tfd, "define xy_%s @ ", p->name);			if (dx > 0)				fprintf(tfd, "\t(($1)-(%g))*%g", pt.x, xfac);			else				fprintf(tfd, "\t%g", xfac);			if (dy > 0)				fprintf(tfd, ", (($2)-(%g))*%g @\n", pt.y, yfac);			else				fprintf(tfd, ", %g @\n", yfac);			fprintf(tfd, "define x_%s @ ", p->name);			if (dx > 0)				fprintf(tfd, "\t(($1)-(%g))*%g @\n", pt.x, xfac);			else				fprintf(tfd, "\t%g @\n", xfac);			fprintf(tfd, "define y_%s @ ", p->name);			if (dy > 0)				fprintf(tfd, "\t(($1)-(%g))*%g @\n", pt.y, yfac);			else				fprintf(tfd, "\t%g @\n", yfac);		}	}	if (codegen)		frame();	if (codegen && autoticks && dfp)		do_autoticks(dfp);	if ((fd = fopen(tempfile, "r")) != NULL) {		while ((c = getc(fd)) != EOF)			putc(c, tfd);		fclose(fd);	}	tfd = NULL;}void endstat(void)	/* clean up after each statement */{	just = sizeop = 0;	lab_up = lab_rt = 0.0;	sizexpr = 0.0;	nnum = 0;	ntick = 0;	tside = 0;	tick_dir = OUT;	ticklen = TICKLEN;}void graph(char *s)	/* graph statement */{	char *p, *os;	int c;	if (codegen) {		fprintf(stdout, "%s: [\n", graphname);		print();	/* pump out previous graph */		fprintf(stdout, "\n] %s\n", graphpos);		reset();	}	if (s) {		dprintf("into graph with <%s>\n", s);		opentemp();		os = s;		while ((c = *s) == ' ' || c == '\t')			s++;		if (c == '\0')			ERROR "no name on graph statement" WARNING;		if (!isupper(s[0]))			ERROR "graph name %s must be capitalized", s WARNING;		for (p=graphname; (c = *s) != ' ' && c != '\t' && c != '\0'; )			*p++ = *s++;		*p = '\0';		strcpy(graphpos, s);		dprintf("graphname = <%s>, graphpos = <%s>\n", graphname, graphpos);		free(os);	}}void setup(void)		/* done at each .G1 */{	static int firstG1 = 0;	reset();	opentemp();	frame_ht = frame_wid = -1;	/* reset in frame() */	ticklen = getvar(lookup("ticklen", 0));	if (firstG1++ == 0)		do_first();	codegen = synerr = 0;	strcpy(graphname, "Graph");	strcpy(graphpos, "");}void do_first(void)	/* done at first .G1:  definitions, etc. */{	extern int lib;	extern char *lib_defines;	static char buf[50], buf1[50];	/* static because pbstr uses them */	FILE *fp;	extern int getpid(void);	sprintf(buf, "define pid /%d/\n", getpid());	pbstr(buf);		if (lib != 0) {		if ((fp = fopen(lib_defines, "r")) != NULL) {			sprintf(buf1, "copy \"%s\"\n", lib_defines);			pbstr(buf1);			fclose(fp);		} else {			fprintf(stderr, "grap warning: can't open %s\n", lib_defines);		}	}}void reset(void)		/* done at each "graph ..." statement */{	Obj *p, *np, *deflist;	extern int tlist, toffside, autodir;	curr_coord = dflt_coord;	ncoord = auto_x = 0;	autoticks = LEFT|BOT;	autodir = 0;	tside = tlist = toffside = 0;	tick_dir = OUT;	margin = MARGIN;	deflist = NULL;	for (p = objlist; p; p = np) {		np = p->next;		if (p->type == DEFNAME || p->type == VARNAME) {			p->next = deflist;			deflist = p;		} else {			free(p->name);			freeattr(p->attr);			free((char *) p);		}	}	objlist = deflist;}void opentemp(void){	if (tfd != NULL)		fclose(tfd);	if (tfd != stdout) {		if (tfd != NULL)			fclose(tfd);		if ((tfd = fopen(tempfile, "w")) == NULL) {			fprintf(stderr, "grap: can't open %s\n", tempfile);			exit(1);		}  	}}

⌨️ 快捷键说明

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