xref: /inferno-os/utils/c2l/cc.h (revision e45fa0eb0763b57d6fb0649c064bc3b95ccdea6c)
1 #include <lib9.h>
2 #include <bio.h>
3 #include <ctype.h>
4 
5 #ifndef	EXTERN
6 #define EXTERN	extern
7 #endif
8 
9 typedef	struct	Node	Node;
10 typedef	struct	Sym	Sym;
11 typedef	struct	Type	Type;
12 typedef	struct	Decl	Decl;
13 typedef	struct	Io	Io;
14 typedef	struct	Hist	Hist;
15 typedef	struct	Term	Term;
16 typedef	struct	Init	Init;
17 typedef	struct	Bits	Bits;
18 
19 typedef	Rune	TRune;
20 
21 #define	NHUNK		50000L
22 #define	BUFSIZ		8192
23 #define	NSYMB		500
24 #define	NHASH		1024
25 #define	STRINGSZ	200
26 #define	HISTSZ		20
27 #define YYMAXDEPTH	500
28 #define	NTERM		10
29 #define	MAXALIGN	7
30 
31 #define	SIGN(n)		((uvlong)1<<(n-1))
32 #define	MASK(n)		(SIGN(n)|(SIGN(n)-1))
33 
34 #define	BITS	5
35 #define	NVAR	(BITS*sizeof(ulong)*8)
36 struct	Bits
37 {
38 	ulong	b[BITS];
39 };
40 
41 EXTERN	int	lastnumbase;
42 
43 #define KNIL	0
44 #define KCHR	1
45 #define KOCT	2
46 #define KDEC	3
47 #define KHEX	4
48 #define KEXP	5
49 #define KDROP	6
50 #define KLAST	7
51 
52 struct	Node
53 {
54 	Node*	left;
55 	Node*	right;
56 	double	fconst;		/* fp constant */
57 	vlong	vconst;		/* non fp const */
58 	char*	cstring;	/* character string */
59 	Rune*	rstring;	/* rune string */
60 
61 	Sym*	sym;
62 	Type*	type;
63 	long	lineno;
64 	char	op;
65 	char	garb;
66 	char kind;
67 	char blk;
68 };
69 #define	Z	((Node*)0)
70 #define	ZZ	((Node*)-1)
71 
72 struct	Sym
73 {
74 	Sym*	link;
75 	Type*	type;
76 	Type*	suetag;
77 	Type*	tenum;
78 	char*	macro;
79 	long	lineno;
80 	long	offset;
81 	vlong	vconst;
82 	double	fconst;
83 	Node*	nconst;
84 	char*	cstring;
85 	Node*	label;
86 	char	*name;
87 	char *lname;
88 	char *mod;
89 	ushort	lexical;
90 	ushort	block;
91 	ushort	sueblock;
92 	char	class;
93 	char kind;
94 	char lkw;
95 	char	args;
96 	char	fd;
97 	char limbo;
98 };
99 #define	S	((Sym*)0)
100 
101 struct	Decl
102 {
103 	Decl*	link;
104 	Sym*	sym;
105 	Type*	type;
106 	long	offset;
107 	long	lineno;
108 	short	val;
109 	ushort	block;
110 	char	class;
111 };
112 #define	D	((Decl*)0)
113 
114 struct	Type
115 {
116 	Sym*	sym;
117 	Sym*	tag;
118 	Type*	link;
119 	Type*	down;
120 	Node*	nwidth;
121 	long	width;
122 	long	offset;
123 	long	lineno;
124 	char	shift;
125 	char	nbits;
126 	char	etype;
127 	char	garb;
128 	char vis;
129 	char	mark;
130 };
131 #define	T	((Type*)0)
132 #define	NODECL	((void(*)(int, Type*, Sym*))0)
133 
134 struct	Init			/* general purpose initialization */
135 {
136 	int	code;
137 	ulong	value;
138 	char*	s;
139 };
140 
141 EXTERN struct
142 {
143 	char*	p;
144 	int	c;
145 } fi;
146 
147 struct	Io
148 {
149 	Io*	link;
150 	char*	p;
151 	char	b[BUFSIZ];
152 	short	c;
153 	short	f;
154 };
155 #define	I	((Io*)0)
156 
157 struct	Hist
158 {
159 	Hist*	link;
160 	char*	name;
161 	long	line;
162 	long	offset;
163 };
164 #define	H	((Hist*)0)
165 EXTERN Hist*	hist;
166 
167 struct	Term
168 {
169 	vlong	mult;
170 	Node	*node;
171 };
172 
173 enum
174 {
175 	Axxx,
176 	Ael1,
177 	Ael2,
178 	Asu2,
179 	Aarg0,
180 	Aarg1,
181 	Aarg2,
182 	Aaut3,
183 	NALIGN,
184 };
185 
186 enum				/* also in ../{8a,0a}.h */
187 {
188 	Plan9	= 1<<0,
189 	Unix	= 1<<1,
190 	Windows	= 1<<2,
191 };
192 
193 enum
194 {
195 	DMARK,
196 	DAUTO,
197 	DSUE,
198 	DLABEL,
199 };
200 enum
201 {
202 	ONOOP,
203 	OXXX,
204 	OADD,
205 	OADDR,
206 	OAND,
207 	OANDAND,
208 	OARRAY,
209 	OAS,
210 	OASI,
211 	OASADD,
212 	OASAND,
213 	OASASHL,
214 	OASASHR,
215 	OASDIV,
216 	OASHL,
217 	OASHR,
218 	OASLDIV,
219 	OASLMOD,
220 	OASLMUL,
221 	OASLSHR,
222 	OASMOD,
223 	OASMUL,
224 	OASOR,
225 	OASSUB,
226 	OASXOR,
227 	OBIT,
228 	OBREAK,
229 	OCASE,
230 	OCAST,
231 	OCOMMA,
232 	OCOND,
233 	OCONST,
234 	OCONTINUE,
235 	ODIV,
236 	ODOT,
237 	ODOTDOT,
238 	ODWHILE,
239 	OENUM,
240 	OEQ,
241 	OFOR,
242 	OFUNC,
243 	OGE,
244 	OGOTO,
245 	OGT,
246 	OHI,
247 	OHS,
248 	OIF,
249 	OIND,
250 	OINDREG,
251 	OINIT,
252 	OLABEL,
253 	OLDIV,
254 	OLE,
255 	OLIST,
256 	OLMOD,
257 	OLMUL,
258 	OLO,
259 	OLS,
260 	OLSHR,
261 	OLT,
262 	OMOD,
263 	OMUL,
264 	ONAME,
265 	ONE,
266 	ONOT,
267 	OOR,
268 	OOROR,
269 	OPOSTDEC,
270 	OPOSTINC,
271 	OPREDEC,
272 	OPREINC,
273 	OPROTO,
274 	OREGISTER,
275 	ORETURN,
276 	OSET,
277 	OSIGN,
278 	OSIZE,
279 	OSTRING,
280 	OLSTRING,
281 	OSTRUCT,
282 	OSUB,
283 	OSWITCH,
284 	OUNION,
285 	OUSED,
286 	OWHILE,
287 	OXOR,
288 	ONEG,
289 	OCOM,
290 	OELEM,
291 
292 	OTST,		/* used in some compilers */
293 	OINDEX,
294 	OFAS,
295 
296 	OBLK,
297 	OPOS,
298 	ONUL,
299 	ODOTIND,
300 	OARRIND,
301 	ODAS,
302 	OASD,
303 	OIOTA,
304 	OLEN,
305 	OBRACKET,
306 	OREF,
307 	OARRAYOF,
308 	OSLICE,
309 	OSADDR,
310 	ONIL,
311 	OS2AB,
312 	OAB2S,
313 	OFILDES,
314 	OFD,
315 	OTUPLE,
316 	OT0,
317 	ORETV,
318 	OCAT,
319 	OSBREAK,
320 	OLDOT,
321 	OMDOT,
322 
323 	OCODE,
324 	ODECE,
325 	ODECT,
326 	ODECV,
327 	ODECF,
328 	OPUSH,
329 	OPOP,
330 
331 	OEND
332 };
333 enum
334 {
335 	TXXX,
336 	TCHAR,
337 	TUCHAR,
338 	TSHORT,
339 	TUSHORT,
340 	TINT,
341 	TUINT,
342 	TLONG,
343 	TULONG,
344 	TVLONG,
345 	TUVLONG,
346 	TFLOAT,
347 	TDOUBLE,
348 	TIND,
349 	TFUNC,
350 	TARRAY,
351 	TVOID,
352 	TSTRUCT,
353 	TUNION,
354 	TENUM,
355 	NTYPE,
356 
357 	TAUTO	= NTYPE,
358 	TEXTERN,
359 	TSTATIC,
360 	TTYPEDEF,
361 	TREGISTER,
362 	TCONSTNT,
363 	TVOLATILE,
364 	TUNSIGNED,
365 	TSIGNED,
366 	TDOT,
367 	TFILE,
368 	TOLD,
369 
370 	TSTRING,
371 	TFD,
372 	TTUPLE,
373 
374 	NALLTYPES,
375 };
376 enum
377 {
378 	CXXX,
379 	CAUTO,
380 	CEXTERN,
381 	CGLOBL,
382 	CSTATIC,
383 	CLOCAL,
384 	CTYPEDEF,
385 	CPARAM,
386 	CSELEM,
387 	CLABEL,
388 	CEXREG,
389 	NCTYPES,
390 };
391 enum
392 {
393 	GXXX		= 0,
394 	GCONSTNT	= 1<<0,
395 	GVOLATILE	= 1<<1,
396 	NGTYPES		= 1<<2,
397 };
398 enum
399 {
400 	BCHAR		= 1L<<TCHAR,
401 	BUCHAR		= 1L<<TUCHAR,
402 	BSHORT		= 1L<<TSHORT,
403 	BUSHORT		= 1L<<TUSHORT,
404 	BINT		= 1L<<TINT,
405 	BUINT		= 1L<<TUINT,
406 	BLONG		= 1L<<TLONG,
407 	BULONG		= 1L<<TULONG,
408 	BVLONG		= 1L<<TVLONG,
409 	BUVLONG		= 1L<<TUVLONG,
410 	BFLOAT		= 1L<<TFLOAT,
411 	BDOUBLE		= 1L<<TDOUBLE,
412 	BIND		= 1L<<TIND,
413 	BFUNC		= 1L<<TFUNC,
414 	BARRAY		= 1L<<TARRAY,
415 	BVOID		= 1L<<TVOID,
416 	BSTRUCT		= 1L<<TSTRUCT,
417 	BUNION		= 1L<<TUNION,
418 	BENUM		= 1L<<TENUM,
419 	BFILE		= 1L<<TFILE,
420 	BOLD		= 1L<<TOLD,
421 	BDOT		= 1L<<TDOT,
422 	BCONSTNT	= 1L<<TCONSTNT,
423 	BVOLATILE	= 1L<<TVOLATILE,
424 	BUNSIGNED	= 1L<<TUNSIGNED,
425 	BSIGNED		= 1L<<TSIGNED,
426 	BAUTO		= 1L<<TAUTO,
427 	BEXTERN		= 1L<<TEXTERN,
428 	BSTATIC		= 1L<<TSTATIC,
429 	BTYPEDEF	= 1L<<TTYPEDEF,
430 	BREGISTER	= 1L<<TREGISTER,
431 
432 	BINTEGER	= BCHAR|BUCHAR|BSHORT|BUSHORT|BINT|BUINT|
433 				BLONG|BULONG|BVLONG|BUVLONG,
434 	BNUMBER		= BINTEGER|BFLOAT|BDOUBLE,
435 
436 /* these can be overloaded with complex types */
437 
438 	BCLASS		= BAUTO|BEXTERN|BSTATIC|BTYPEDEF|BREGISTER,
439 
440 	BGARB		= BCONSTNT|BVOLATILE,
441 };
442 
443 EXTERN struct
444 {
445 	Type*	tenum;		/* type of entire enum */
446 	Type*	cenum;		/* type of current enum run */
447 	vlong	lastenum;	/* value of current enum */
448 	double	floatenum;	/* value of current enum */
449 } en;
450 
451 EXTERN	int	autobn;
452 EXTERN	long	autoffset;
453 EXTERN	int	blockno;
454 EXTERN	int	comm;
455 EXTERN	Decl*	dclstack;
456 EXTERN	int	doaddr;
457 EXTERN	int	doalladdr;
458 EXTERN	int	doinc;
459 EXTERN	int	doloc;
460 EXTERN	int	domod;
461 EXTERN	Hist*	ehist;
462 EXTERN	long	firstbit;
463 EXTERN	Decl*	firstdcl;
464 EXTERN	int	fperror;
465 EXTERN	Sym*	hash[NHASH];
466 EXTERN	char*	hunk;
467 EXTERN	char*	include[20];
468 EXTERN	Type*	fdtype;
469 EXTERN	int	inmain;
470 EXTERN	Io*	iofree;
471 EXTERN	Io*	ionext;
472 EXTERN	Io*	iostack;
473 EXTERN	int	justcode;
474 EXTERN	long	lastbit;
475 EXTERN	char	lastclass;
476 EXTERN	Type*	lastdcl;
477 EXTERN	long	lastfield;
478 EXTERN	Type*	lasttype;
479 EXTERN	long	lineno;
480 EXTERN	long	nearln;
481 EXTERN	int	nerrors;
482 EXTERN	int	newflag;
483 EXTERN	long	nhunk;
484 EXTERN	int	ninclude;
485 EXTERN	Node*	nodproto;
486 EXTERN	Node*	nodcast;
487 EXTERN	int	passes;
488 EXTERN	char*	pathname;
489 EXTERN	int	peekc;
490 EXTERN	Type*	pfdtype;
491 EXTERN	long	pline;
492 EXTERN	long	saveline;
493 EXTERN	Type*	strf;
494 EXTERN	int	strings;
495 EXTERN	Type*	stringtype;
496 EXTERN	Type*	strl;
497 EXTERN	char	symb[NSYMB];
498 EXTERN	Sym*	symstring;
499 EXTERN	int	taggen;
500 EXTERN	Type*	tfield;
501 EXTERN	Type*	tufield;
502 EXTERN	int	thechar;
503 EXTERN	char*	thestring;
504 EXTERN	Type*	thisfn;
505 EXTERN	long	thunk;
506 EXTERN	Type*	types[NTYPE];
507 EXTERN	Node*	initlist;
508 EXTERN	int	nterm;
509 EXTERN	int	hjdickflg;
510 EXTERN	int	fproundflg;
511 EXTERN	Bits	zbits;
512 
513 extern	char	*onames[], *tnames[], *gnames[];
514 extern	char	*cnames[], *qnames[], *bnames[];
515 extern	char	tab[NTYPE][NTYPE];
516 extern	char	comrel[], invrel[], logrel[];
517 extern	long	ncast[], tadd[], tand[];
518 extern	long	targ[], tasadd[], tasign[], tcast[];
519 extern	long	tdot[], tfunct[], tindir[], tmul[];
520 extern	long	tnot[], trel[], tsub[];
521 
522 extern	char	typeaf[];
523 extern	char	typefd[];
524 extern	char	typei[];
525 extern	char	typesu[];
526 extern	char	typesuv[];
527 extern	char	typeu[];
528 extern	char	typev[];
529 extern	char	typec[];
530 extern	char	typeh[];
531 extern	char	typeil[];
532 extern	char	typeilp[];
533 extern	char	typechl[];
534 extern	char	typechlp[];
535 extern	char	typechlpfd[];
536 
537 extern	ulong	thash1;
538 extern	ulong	thash2;
539 extern	ulong	thash3;
540 extern	ulong	thash[];
541 
542 /*
543  *	Inferno.c/Posix.c/Nt.c
544  */
545 int	mywait(int*);
546 int	mycreat(char*, int);
547 int	systemtype(int);
548 int	pathchar(void);
549 char*	mygetwd(char*, int);
550 int	myexec(char*, char*[]);
551 int	mydup(int, int);
552 int	myfork(void);
553 int	mypipe(int*);
554 void*	mysbrk(ulong);
555 
556 /*
557  *	parser
558  */
559 int	yyparse(void);
560 int	mpatof(char*, double*);
561 int	mpatov(char*, vlong*);
562 
563 /*
564  *	lex.c
565  */
566 void*	allocn(void*, long, long);
567 void*	alloc(long);
568 void	cinit(void);
569 int	compile(char*, char**, int);
570 void	errorexit(void);
571 int	filbuf(void);
572 int	getc(void);
573 long	getr(void);
574 int	getnsc(void);
575 Sym*	lookup(void);
576 void	main(int, char*[]);
577 void	newfile(char*, int);
578 void	newio(void);
579 void	outbegin(char *);
580 void	outend(void);
581 void	outfun(Node*);
582 void	pushio(void);
583 long	escchar(long, int, int);
584 Sym*	slookup(char*);
585 void	syminit(Sym*);
586 void	unget(int);
587 long	yylex(void);
588 int	Lconv(Fmt*);
589 int	Tconv(Fmt*);
590 int	FNconv(Fmt*);
591 int	Oconv(Fmt*);
592 int	Qconv(Fmt*);
593 int	VBconv(Fmt*);
594 void	setinclude(char*);
595 
596 /*
597  * mac.c
598  */
599 void	dodefine(char*);
600 void	domacro(void);
601 Sym*	getsym(void);
602 long	getnsn(void);
603 void	linehist(char*, int);
604 void	macdef(void);
605 void	macprag(void);
606 void	macend(void);
607 void	macexpand(Sym*, char*);
608 void	macif(int);
609 void	macinc(void);
610 void	maclin(void);
611 void	macund(void);
612 
613 /*
614  * dcl.c
615  */
616 Node*	doinit(Sym*, Type*, long, Node*);
617 Type*	tcopy(Type*);
618 void	init1(Sym*, Type*, long, int);
619 Node*	newlist(Node*, Node*);
620 void	adecl(int, Type*, Sym*);
621 int	anyproto(Node*);
622 void	argmark(Node*, int);
623 void	dbgdecl(Sym*);
624 Node*	dcllabel(Sym*, int);
625 Node*	dodecl(void(*)(int, Type*, Sym*), int, Type*, Node*, int);
626 Sym*	mkstatic(Sym*);
627 void	doenum(Sym*, Node*);
628 void	snap(Type*);
629 Type*	dotag(Sym*, int, int);
630 void	edecl(int, Type*, Sym*);
631 Type*	fnproto(Node*);
632 Type*	fnproto1(Node*);
633 void	markdcl(void);
634 Type*	paramconv(Type*, int);
635 void	pdecl(int, Type*, Sym*);
636 Decl*	push(void);
637 Decl*	push1(Sym*);
638 Node*	revertdcl(void);
639 #undef round
640 #define	round	ccround
641 long	round(long, int);
642 int	rsametype(Type*, Type*, int, int);
643 int	sametype(Type*, Type*);
644 ulong	signature(Type*, int);
645 void	suallign(Type*);
646 void	tmerge(Type*, Sym*);
647 void	walkparam(Node*, int);
648 void	xdecl(int, Type*, Sym*);
649 Node*	contig(Sym*, Node*, long);
650 
651 /*
652  * com.c
653  */
654 void	ccom(Node*);
655 void	complex(Node*);
656 int	tcom(Node*);
657 int	tcoma(Node*, Node*, Type*, int);
658 int	tcomd(Node*, Type*);
659 int	tcomo(Node*, int);
660 int	tcomx(Node*);
661 int	tlvalue(Node*);
662 void	constas(Node*, Type*, Type*);
663 
664 /*
665  * con.c
666  */
667 void	acom(Node*);
668 void	acom1(vlong, Node*);
669 void	acom2(Node*, Type*);
670 int	acomcmp1(void*, void*);
671 int	acomcmp2(void*, void*);
672 int	addo(Node*);
673 void	evconst(Node*);
674 
675 /*
676  * sub.c
677  */
678 void	arith(Node*, int);
679 Type*	dotsearch(Sym*, Type*, Node*);
680 long	dotoffset(Type*, Type*, Node*);
681 void	gethunk(void);
682 Node*	invert(Node*);
683 int	bitno(long);
684 void	makedot(Node*, Type*, long);
685 Node*	new(int, Node*, Node*);
686 Node*	new1(int, Node*, Node*);
687 int	nilcast(Type*, Type*);
688 int	nocast(Type*, Type*);
689 void	prtree(Node*, char*);
690 void	prtree1(Node*, int, int);
691 void	relcon(Node*, Node*);
692 int	relindex(int);
693 int	simpleg(long);
694 Type*	garbt(Type*, long);
695 int	simplec(long);
696 Type*	simplet(long);
697 int	stcompat(Node*, Type*, Type*, long[]);
698 int	tcompat(Node*, Type*, Type*, long[]);
699 void	tinit(void);
700 Type*	typ(int, Type*);
701 Type*	typ1(int, Type*);
702 void	typeext(Type*, Node*);
703 void	typeext1(Type*, Node*);
704 int	side(Node*);
705 int	vconst(Node*);
706 int	vlog(Node*);
707 int	topbit(ulong);
708 long	typebitor(long, long);
709 void	diag(Node*, char*, ...);
710 void	warn(Node*, char*, ...);
711 void	yyerror(char*, ...);
712 void	fatal(Node*, char*, ...);
713 
714 /*
715  * acid.c
716  */
717 void	acidtype(Type*);
718 void	acidvar(Sym*);
719 
720 /*
721  * bits.c
722  */
723 Bits	bor(Bits, Bits);
724 Bits	band(Bits, Bits);
725 Bits	bnot(Bits);
726 int	bany(Bits*);
727 int	bnum(Bits);
728 Bits	blsh(uint);
729 int	beq(Bits, Bits);
730 int	bset(Bits, uint);
731 
732 /*
733  * dpchk.c
734  */
735 void	dpcheck(Node*);
736 void	arginit(void);
737 void	pragvararg(void);
738 void	praghjdicks(void);
739 void	pragfpround(void);
740 
741 /*
742  * calls to machine depend part
743  */
744 void	codgen(Node*, Node*, int);
745 void	gclean(void);
746 void	gextern(Sym*, Node*, long, long);
747 void	ginit(void);
748 long	outstring(char*, long);
749 long	outlstring(Rune*, long);
750 void	sextern(Sym*, Node*, long, long);
751 void	xcom(Node*);
752 long	exreg(Type*);
753 long	align(long, Type*, int);
754 long	maxround(long, long);
755 
756 extern	schar	ewidth[];
757 
758 /*
759  * com64
760  */
761 int	com64(Node*);
762 void	com64init(void);
763 void	bool64(Node*);
764 double	convvtof(vlong);
765 vlong	convftov(double);
766 double	convftox(double, int);
767 vlong	convvtox(vlong, int);
768 
769 #pragma	varargck	argpos	warn	2
770 #pragma	varargck	argpos	diag	2
771 #pragma	varargck	argpos	yyerror	1
772 
773 #pragma	varargck	type	"F"	Node*
774 #pragma	varargck	type	"L"	long
775 #pragma	varargck	type	"Q"	long
776 #pragma	varargck	type	"O"	int
777 #pragma	varargck	type	"T"	Type*
778 #pragma	varargck	type	"|"	int
779 
780 /* output routines */
781 
782 void prline(char*);
783 void prstr(char *);
784 void prlstr(Rune *);
785 void prkeywd(char *);
786 void prid(char *);
787 void	prsym(Sym*, int);
788 void	prsym0(Sym*);
789 void prdelim(char *);
790 void prchar(vlong);
791 void prreal(double, char*, int);
792 void prnum(vlong, int, Type*);
793 void	prcom(char *, Node*);
794 void newline(void);
795 void incind(void);
796 void decind(void);
797 int	zeroind(void);
798 void	restoreind(int);
799 void startcom(int);
800 void	addcom(int);
801 void	endcom(void);
802 int	outcom(int);
803 int	arrow(Sym*);
804 
805 /* limbo generating routines */
806 
807 void pgen(int);
808 void epgen(int);
809 void ttgen(Type*);
810 void vtgen(Node*);
811 void etgen(Sym*);
812 void expgen(Node*);
813 
814 /* -m routines */
815 
816 void	newsec(int);
817 
818 void outpush(char*);
819 void outpop(int);
820 void outpush0(char*, Node*);
821 void outpop0(int);
822 void outpush2(char*, Node*);
823 void outpop2(int);
824 char*	outmod(char*, int);
825 
826 /* miscellaneous */
827 
828 int iscon(char*);
829 Node* ncopy(Node*);
830 void doasenum(Sym*);
831 Type *maxtype(Type*, Type*);
832 
833 void	linit(void);
834 void	sysinit(void);
835 
836 int ism(void);
837 int isb(void);
838 int dolog(void);
839 
840 int line(Node*);
841 
842 void	output(long, int);
843 void usemod(Sym*, int);
844 void setmod(Sym*);
845 
846 int	exists(char*);
847 int	isconsym(Sym *);
848 
849 void clbegin(void);
850 void clend(void);
851 
852 int gfltconv(Fmt*);
853