126 lines · 1.6 KB · C
RawDownload
#include <u.h>#include <libc.h>#include <ctype.h>#include <bio.h>#include <thread.h>#include <llrb.h>#include "ccc.h" Biobuf bin, bout;int infd;vlong cur, last;int fstack, line;char filename[1024]; voidsetupout(void){	Binit(&bout, 1, OWRITE);} voidpushfile(char *file){	int fd; 	fd = open(file, OREAD);	pushstream(fd);} voidpushstream(int fd){	cur = 0;	Binit(&bin, fd, OREAD);	infd = dup(fd, -1);	if(fstack++ == 1)		return;	line = 1;	if(fd2path(fd, filename, sizeof(filename)) != 0)		error("Could not get filename.");} Runegetr(void){	Rune r; 	r = Bgetrune(&bin);	cur++;	if(isspacer(r)) {		if(r == '\n' && fstack == 1)			line++;	}	return r;} intungetr(void){	cur--;	return Bungetrune(&bin);} voidcopyout(void){	static char buf[1024];	long n, r; 	for(n = cur-last; n > 0; n -= r) {		r = n < sizeof(buf) ? n : sizeof(buf);		r = pread(infd, buf, r, cur-n);		if(r == -1)			error("Read error.");		if(write(1, buf, r) != r)			error("Write error.");	}	last = cur;} voidnocopyout(void){	last = cur;} voidprintchandecls(Symlist *slist){	Sym **si, *s; 	if(slist == nil)		return; 	print("\n#line %d %s\n", line, filename);	for(si = slist->sp; si < slist->ep; si++) {		s = *si;		print("%Y%s", s, si+1 < slist->ep ? ", " : ";\n");	}} intisspacer(Rune r){	if(r < Runeself && isspace(r))		return 1;	return 0;} intisalphar(Rune r){	if(r < Runeself && (isalpha(r) || r == L'_'))		return 1;	if(r >= Runeself)		return 1;	return 0;} intisdigitr(Rune r){	if(r < Runeself && isdigit(r))		return 1;	return 0;}