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

📄 plot.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
字号:
#include <stdio.h>#include <stdlib.h>#include <math.h>#include "grap.h"#include "y.tab.h"void line(int type, Point p1, Point p2, Attr *desc)	/* draw a line segment */{	fprintf(tfd, "%s %s from %s",		type==LINE ? "line" : "arrow",  desc_str(desc), xyname(p1));	fprintf(tfd, " to %s", xyname(p2));	/* 'cause xyname is botched */	fprintf(tfd, "\n");	range(p1);	range(p2);}void circle(double r, Point pt)		/* draw a circle */{	if (r > 0.0)		fprintf(tfd, "circle rad %g at %s\n", r, xyname(pt));	else		fprintf(tfd, "\"\\s-3\\(ob\\s0\" at %s\n", xyname(pt));	range(pt);}char *xyname(Point pt)	/* generate xy name macro for point p */{	static char buf[200];	Obj *p;	p = pt.obj;	if (p->log & XFLAG) {		if (pt.x <= 0.0)			ERROR "can't take log of x coord %g", pt.x FATAL;		logit(pt.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);	}	sprintf(buf, "xy_%s(%g,%g)", p->name, pt.x, pt.y);	return buf;	/* WATCH IT:  static */}void pic(char *s)	/* fire out pic stuff directly */{	while (*s == ' ')		s++;	fprintf(tfd, "%s\n", s);}int	auto_x	= 0;	/* counts abscissa if none provided */void numlist(void)	/* print numbers in default way */{	Obj *p;	Point pt;	int i;	static char *spot = "\\(bu";	Attr *ap;	p = pt.obj = lookup(curr_coord, 1);	if (nnum == 1) {		nnum = 2;		num[1] = num[0];		num[0] = ++auto_x;	}	pt.x = num[0];	if (p->attr && p->attr->sval)		spot = p->attr->sval;	for (i = 1; i < nnum; i++) {		pt.y = num[i];		if (p->attr == 0 || p->attr->type == 0) {			ap = makesattr(tostring(spot));			plot(ap, pt);		} else			next(p, pt, p->attr);	}	nnum = 0;}void plot(Attr *sl, Point pt)	/* put stringlist sl at point pt */{	fprintf(tfd, "%s at %s\n", slprint(sl), xyname(pt));	range(pt);	freeattr(sl);}void plotnum(double f, char *fmt, Point pt)	/* plot value f at point */{	char buf[100];	if (fmt) {		sprintf(buf, fmt, f);		free(fmt);	} else if (f >= 0.0)		sprintf(buf, "%g", f);	else		sprintf(buf, "\\-%g", -f);	fprintf(tfd, "\"%s\" at %s\n", buf, xyname(pt));	range(pt);}void drawdesc(int type, Obj *p, Attr *desc, char *s)	/* set line description for p */{	p->attr = desc;	p->attr->sval = s;	if (type == NEW) {		p->first = 0;	/* so it really looks new */		auto_x = 0;	}}void next(Obj *p, Point pt, Attr *desc)	/* add component to a path */{	char *s;	if (p->first == 0) {		p->first++;		fprintf(tfd, "L%s: %s\n", p->name, xyname(pt));	} else {		fprintf(tfd, "line %s from L%s to %s; L%s: Here\n",			desc_str(desc->type ? desc : p->attr),			p->name, xyname(pt), p->name);	}	if (p->attr && (s=p->attr->sval)) {		/* BUG: should fix size here */		fprintf(tfd, "\"%s\" at %s\n", s, xyname(pt));	}	range(pt);}

⌨️ 快捷键说明

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