Annotation of OpenXM_contrib/pari/src/graph/Gnuplot.h, Revision 1.1
1.1 ! maekawa 1: /* This header should be included in one C file only! */
! 2:
! 3: #include <stdio.h>
! 4: #include <stdlib.h>
! 5: #include <setjmp.h>
! 6:
! 7: #ifdef __cplusplus
! 8: extern "C" {
! 9: #endif
! 10:
! 11: /* CAT2:
! 12: * This macro catenates 2 tokens together.
! 13: */
! 14: /* STRINGIFY:
! 15: * This macro surrounds its token with double quotes.
! 16: */
! 17: #ifndef CAT2
! 18: # if 42 == 1
! 19: # define CAT2(a,b)a/**/b
! 20: # define CAT3(a,b,c)a/**/b/**/c
! 21: # define CAT4(a,b,c,d)a/**/b/**/c/**/d
! 22: # define CAT5(a,b,c,d,e)a/**/b/**/c/**/d/**/e
! 23: # define STRINGIFY(a)"a"
! 24: /* If you can get stringification with catify, tell me how! */
! 25: # endif
! 26: # if 42 == 42
! 27: # define CAT2(a,b)a ## b
! 28: # define CAT3(a,b,c)a ## b ## c
! 29: # define CAT4(a,b,c,d)a ## b ## c ## d
! 30: # define CAT5(a,b,c,d,e)a ## b ## c ## d ## e
! 31: # define StGiFy(a)# a
! 32: # define STRINGIFY(a)StGiFy(a)
! 33: # define SCAT2(a,b)StGiFy(a) StGiFy(b)
! 34: # define SCAT3(a,b,c)StGiFy(a) StGiFy(b) StGiFy(c)
! 35: # define SCAT4(a,b,c,d)StGiFy(a) StGiFy(b) StGiFy(c) StGiFy(d)
! 36: # define SCAT5(a,b,c,d,e)StGiFy(a) StGiFy(b) StGiFy(c) StGiFy(d) StGiFy(e)
! 37: # endif
! 38: # ifndef CAT2
! 39: # include "Bletch: How does this C preprocessor catenate tokens?"
! 40: # endif
! 41: #endif /* CAT2 */
! 42:
! 43:
! 44: #define TERM_CAN_MULTIPLOT 1 /* tested if stdout not redirected */
! 45: #define TERM_CANNOT_MULTIPLOT 2 /* tested if stdout is redirected */
! 46: #define TERM_BINARY 4 /* open output file with "b" */
! 47:
! 48: #ifndef NO_JUNK_SMALL
! 49:
! 50: /* Compatibility with the old gnuplot: */
! 51: extern FILE *outfile;
! 52: FILE *outfile = NULL;
! 53:
! 54: extern FILE *gpoutfile;
! 55: FILE *gpoutfile = NULL;
! 56:
! 57: static outfile_set;
! 58: static void
! 59: set_gpoutfile(void)
! 60: {
! 61: outfile = stdout;
! 62: gpoutfile = stdout;
! 63: }
! 64:
! 65: #define SET_OUTFILE (outfile_set++ ? 1 : (set_gpoutfile(), 1))
! 66:
! 67: extern int encoding;
! 68: int encoding = 0;
! 69: extern float xoffset; /* x origin */
! 70: extern float yoffset; /* y origin */
! 71: float xoffset = 0.0; /* x origin */
! 72: float yoffset = 0.0; /* y origin */
! 73: extern int multiplot;
! 74: int multiplot = 0;
! 75:
! 76: extern char *outstr;
! 77: #define MAX_ID_LEN 50
! 78: /* char outstr[MAX_ID_LEN+1] = "STDOUT"; */
! 79: char *outstr = NULL;
! 80: extern double ticscale; /* scale factor for tic marks (was (0..1])*/
! 81: double ticscale = 1.0; /* scale factor for tic mark */
! 82:
! 83: char *input_line = NULL;
! 84: int inline_num; /* from command.c */
! 85:
! 86: float xsize=1.0, ysize=1.0;
! 87: double pointsize=1.0; /* During test! */
! 88:
! 89: int interactive; /* from plot.c */
! 90: char *infile_name; /* from plot.c */
! 91: extern char default_font[];
! 92: char default_font[MAX_ID_LEN+1] = "\0"; /* Entry added by DJL */
! 93:
! 94: typedef int TBOOLEAN;
! 95:
! 96: enum DATA_TYPES {
! 97: INTGR, CMPLX
! 98: };
! 99:
! 100: #if !(defined(ATARI)&&defined(__GNUC__)&&defined(_MATH_H)) && !(defined(MTOS)&&defined(__GNUC__)&&defined(_MATH_H)) /* FF's math.h has the type already */
! 101: struct cmplx {
! 102: double real, imag;
! 103: };
! 104: #endif
! 105:
! 106: struct value {
! 107: enum DATA_TYPES type;
! 108: union {
! 109: int int_val;
! 110: struct cmplx cmplx_val;
! 111: } v;
! 112: };
! 113:
! 114: struct lexical_unit { /* produced by scanner */
! 115: TBOOLEAN is_token; /* true if token, false if a value */
! 116: struct value l_val;
! 117: int start_index; /* index of first char in token */
! 118: int length; /* length of token in chars */
! 119: };
! 120:
! 121: /* char *token; */
! 122: #define MAX_TOKENS 20
! 123: extern struct lexical_unit *token;
! 124: struct lexical_unit tokens[MAX_TOKENS]; /* We only process options,
! 125: there should not be many */
! 126: struct lexical_unit *token = tokens;
! 127: long c_token = 0, num_tokens = 0;
! 128: char term_options[200] = "";
! 129:
! 130: /* Here are the only missing functions: */
! 131:
! 132: struct value*
! 133: const_express(struct value*v)
! 134: {
! 135: if (token[c_token].is_token)
! 136: croak("Expect a number, got a string");
! 137: *v = token[c_token++].l_val;
! 138: return v;
! 139: }
! 140:
! 141: void*
! 142: gp_alloc(unsigned long size, char *usage)
! 143: {
! 144: return malloc(size);
! 145: }
! 146:
! 147: void*
! 148: gp_realloc(void *old, unsigned long size, char *usage)
! 149: {
! 150: return realloc(old,size);
! 151: }
! 152:
! 153: void
! 154: bail_to_command_line()
! 155: {
! 156: croak("panic: gnuplot");
! 157: }
! 158:
! 159: #endif /* NO_JUNK_SMALL */
! 160:
! 161: /* Cannot pull the whole plot.h, too many contradictions. */
! 162:
! 163: #ifdef __ZTC__
! 164: typedef int (*FUNC_PTR)(...);
! 165: #else
! 166: typedef int (*FUNC_PTR)();
! 167: #endif
! 168:
! 169: struct TERMENTRY {
! 170: char *name;
! 171: #if defined(_Windows) && !defined(WIN32)
! 172: char GPFAR description[80]; /* to make text go in FAR segment */
! 173: #else
! 174: char *description;
! 175: #endif
! 176: unsigned int xmax,ymax,v_char,h_char,v_tic,h_tic;
! 177: FUNC_PTR options,init,reset,text,scale,graphics,move,vector,linetype,
! 178: put_text,text_angle,justify_text,point,arrow,set_font,
! 179: pointsize;
! 180: int flags;
! 181: FUNC_PTR suspend,resume,fillbox,linewidth;
! 182: };
! 183:
! 184: #ifdef _Windows
! 185: # define termentry TERMENTRY far
! 186: #else
! 187: # define termentry TERMENTRY
! 188: #endif
! 189:
! 190: extern struct termentry *term;
! 191: struct termentry *term;
! 192:
! 193: #define RETVOID
! 194: #define RETINT , 1
! 195:
! 196: #define F_0 void(*)()
! 197: #define F_1 void(*)(int)
! 198: #define F_1I int(*)(int)
! 199: #define F_1D void(*)(double)
! 200: #define F_1IP int(*)(char*)
! 201: #define F_2 void(*)(unsigned int,unsigned int)
! 202: #define F_2D int(*)(double,double)
! 203: #define F_3 void(*)(unsigned int,unsigned int,int)
! 204: #define F_3T void(*)(int,int,char*)
! 205: #define F_4 void(*)(int,int,int,int)
! 206: #define F_5 void(*)(int,int,int,int,int)
! 207:
! 208: #define CALL_G_METH0(method) CALL_G_METH(method,0,(),RETVOID)
! 209: #define CALL_G_METH1(method,arg1) CALL_G_METH(method,1,(arg1),RETVOID)
! 210: #define CALL_G_METH1I(method,arg1) CALL_G_METH(method,1I,(arg1),RETINT)
! 211: #define CALL_G_METH1D(method,arg1) CALL_G_METH(method,1D,(arg1),RETVOID)
! 212: #define CALL_G_METH1IP(method,arg1) CALL_G_METH(method,1IP,(arg1),RETINT)
! 213: #define CALL_G_METH2(method,arg1,arg2) \
! 214: CALL_G_METH(method,2,((arg1),(arg2)),RETVOID)
! 215: #define CALL_G_METH2D(method,arg1,arg2) \
! 216: CALL_G_METH(method,2D,((arg1),(arg2)),RETINT)
! 217: #define CALL_G_METH3(method,arg1,arg2,arg3) \
! 218: CALL_G_METH(method,3,((arg1),(arg2),(arg3)),RETVOID)
! 219: #define CALL_G_METH3T(method,arg1,arg2,arg3) \
! 220: CALL_G_METH(method,3T,((arg1),(arg2),(arg3)),RETVOID)
! 221: #define CALL_G_METH4(method,arg1,arg2,arg3,arg4) \
! 222: CALL_G_METH(method,4,((arg1),(arg2),(arg3),(arg4)),RETVOID)
! 223: #define CALL_G_METH5(method,arg1,arg2,arg3,arg4,arg5) \
! 224: CALL_G_METH(method,5,((arg1),(arg2),(arg3),(arg4),(arg5)),RETVOID)
! 225:
! 226: #define CALL_G_METH(method,mult,args,returnval) ( \
! 227: (term==0) ? ( \
! 228: croak("No terminal specified") returnval \
! 229: ) : \
! 230: (*(CAT2(F_,mult))term->method)args \
! 231: )
! 232:
! 233: #define GET_G_FLAG(mask) ( \
! 234: (term==0) ? ( \
! 235: croak("No terminal specified") RETINT \
! 236: ) : \
! 237: (term->flags & (mask)))
! 238:
! 239: #ifdef DONT_POLLUTE_INIT
! 240: # define gptable_init() CALL_G_METH0(init)
! 241: #else
! 242: # define init() CALL_G_METH0(init)
! 243: # define gptable_init init
! 244: #endif
! 245: #define reset() CALL_G_METH0(reset)
! 246: #define text() CALL_G_METH0(text)
! 247: #define options() CALL_G_METH0(options)
! 248: #define graphics() CALL_G_METH0(graphics)
! 249: #define linetype(lt) CALL_G_METH1(linetype,lt)
! 250: #define justify_text(mode) CALL_G_METH1I(justify_text,mode)
! 251: #define text_angle(ang) CALL_G_METH1I(text_angle,ang)
! 252: #define scale(xs,ys) CALL_G_METH2D(scale,xs,ys)
! 253: #define move(x,y) CALL_G_METH2(move,x,y)
! 254: #define vector(x,y) CALL_G_METH2(vector,x,y)
! 255: #define put_text(x,y,str) CALL_G_METH3T(put_text,x,y,str)
! 256: #define point(x,y,p) CALL_G_METH3(point,x,y,p)
! 257: #define arrow(sx,sy,ex,ey,head) CALL_G_METH5(arrow,sx,sy,ex,ey,head)
! 258: #define set_font(font) CALL_G_METH1IP(set_font,font)
! 259: #define setpointsize(size) CALL_G_METH1D(pointsize,size)
! 260: #define suspend() CALL_G_METH0(suspend)
! 261: #define resume() CALL_G_METH0(resume)
! 262: #define fillbox(sx,sy,ex,ey,head) CALL_G_METH5(fillbox,sx,sy,ex,ey,head)
! 263: #define linewidth(size) CALL_G_METH1D(linewidth,size)
! 264: #define can_multiplot() GET_G_FLAG(TERM_CAN_MULTIPLOT)
! 265: #define cannot_multiplot() GET_G_FLAG(TERM_CANNOT_MULTIPLOT)
! 266: #define is_binary() GET_G_FLAG(TERM_BINARY)
! 267:
! 268: #define termprop(prop) (term->prop)
! 269: #define termset(term) my_change_term(term,strlen(term))
! 270:
! 271: struct termentry * change_term(char*,int);
! 272:
! 273: #define TTABLE_STARTPLOT 0
! 274: #define TTABLE_ENDPLOT 1
! 275: #define TTABLE_STARTMPLOT 2
! 276: #define TTABLE_ENDMPLOT 3
! 277: #define TTABLE_INIT 4
! 278: #define TTABLE_LIST 5
! 279: #define TTABLE_COUNT 6
! 280:
! 281: typedef void (*TSET_FP)(char *s);
! 282: typedef void (*TST_END_FP)(void);
! 283: typedef void (*SET_SIZES_t)(double x, double y);
! 284: typedef double (*GET_SIZES_t)(int flag);
! 285:
! 286: struct t_ftable {
! 287: int loaded;
! 288: FUNC_PTR change_term_p;
! 289: TSET_FP term_set_outputp;
! 290: SET_SIZES_t set_sizesp;
! 291: GET_SIZES_t get_sizesp;
! 292: TST_END_FP term_funcs[TTABLE_COUNT];
! 293: };
! 294:
! 295: #ifdef DYNAMIC_PLOTTING /* Can load plotting DLL later */
! 296:
! 297: UNKNOWN_null()
! 298: {
! 299: croak("gnuplot-like plotting environment not loaded yet");
! 300: }
! 301:
! 302: static void myterm_table_not_loaded_v(void);
! 303: static void myterm_table_not_loaded(char*);
! 304: static int myterm_table_not_loaded_u();
! 305: static void myterm_table_not_loaded_vdd(double x, double y);
! 306: static double myterm_table_not_loaded_di(int flag);
! 307:
! 308: #if 0
! 309: static int ftable_warned;
! 310: static void
! 311: tmp_my_term_init
! 312: {
! 313: if (!warned++)
! 314: warn("This runtime link with gnuplot-shim does not implement midlevel start/end functions");
! 315: shim_myinit();
! 316: }
! 317: #endif
! 318:
! 319: static struct t_ftable my_term_ftable =
! 320: {
! 321: 0, &myterm_table_not_loaded_u, &myterm_table_not_loaded,
! 322: &myterm_table_not_loaded_vdd,
! 323: &myterm_table_not_loaded_di,
! 324: {&myterm_table_not_loaded_v, &myterm_table_not_loaded_v,
! 325: &myterm_table_not_loaded_v, &myterm_table_not_loaded_v,
! 326: &myterm_table_not_loaded_v, &myterm_table_not_loaded_v}
! 327: };
! 328:
! 329: static struct t_ftable *my_term_ftablep = &my_term_ftable;
! 330:
! 331: static void
! 332: myterm_table_not_loaded_v(void)
! 333: {
! 334: if (!my_term_ftablep->loaded) {
! 335: UNKNOWN_null();
! 336: return;
! 337: }
! 338: croak("This runtime link with gnuplot-shim does not implement midlevel start/end functions");
! 339: }
! 340:
! 341: static void
! 342: myterm_table_not_loaded(char *s)
! 343: {
! 344: myterm_table_not_loaded_v();
! 345: }
! 346:
! 347: static void
! 348: myterm_table_not_loaded_vdd(double x, double y)
! 349: {
! 350: myterm_table_not_loaded_v();
! 351: }
! 352:
! 353: static double
! 354: myterm_table_not_loaded_di(int flag)
! 355: {
! 356: myterm_table_not_loaded_v();
! 357: }
! 358:
! 359: static int
! 360: myterm_table_not_loaded_u()
! 361: {
! 362: myterm_table_not_loaded_v();
! 363: return 0;
! 364: }
! 365:
! 366: # define change_term (*my_term_ftablep->change_term_p)
! 367: # define term_set_output (*my_term_ftablep->term_set_outputp)
! 368: # define term_start_plot (*my_term_ftablep->term_funcs[TTABLE_STARTPLOT])
! 369: # define term_end_plot (*my_term_ftablep->term_funcs[TTABLE_ENDPLOT])
! 370: # define term_start_multiplot (*my_term_ftablep->term_funcs[TTABLE_STARTMPLOT])
! 371: # define term_end_multiplot (*my_term_ftablep->term_funcs[TTABLE_ENDMPLOT])
! 372: # define term_init (*my_term_ftablep->term_funcs[TTABLE_INIT])
! 373: # define list_terms (*my_term_ftablep->term_funcs[TTABLE_LIST])
! 374: # define plotsizes_scale (*my_term_ftablep->set_sizesp)
! 375: # define plotsizes_scale_get (*my_term_ftablep->get_sizesp)
! 376:
! 377: # define scaled_xmax() ((int)termprop(xmax)*plotsizes_scale_get(0))
! 378: # define scaled_ymax() ((int)termprop(ymax)*plotsizes_scale_get(1))
! 379:
! 380: #define USE_FUNCTION_FROM_TABLE
! 381:
! 382: static struct termentry *
! 383: my_change_term(char*s,int l)
! 384: {
! 385: SET_OUTFILE;
! 386: if (!my_term_ftablep->change_term_p)
! 387: UNKNOWN_null();
! 388: return term = (struct termentry *)(*my_term_ftablep->change_term_p)(s,l);
! 389: }
! 390:
! 391: static struct termentry dummy_term_tbl[] = {
! 392: {"unknown", "Unknown terminal type - not a plotting device",
! 393: 100, 100, 1, 1,
! 394: 1, 1, UNKNOWN_null, UNKNOWN_null, UNKNOWN_null,
! 395: UNKNOWN_null, UNKNOWN_null, UNKNOWN_null, UNKNOWN_null, UNKNOWN_null,
! 396: UNKNOWN_null, UNKNOWN_null, UNKNOWN_null,
! 397: UNKNOWN_null, UNKNOWN_null, UNKNOWN_null, UNKNOWN_null, UNKNOWN_null, 0,
! 398: UNKNOWN_null, UNKNOWN_null, UNKNOWN_null, UNKNOWN_null},
! 399: };
! 400:
! 401: #define set_term_funcp(change_p, term_p) set_term_funcp2((change_p), 0)
! 402: /* #define set_term_funcp3(change_p, term_p, tchange) \
! 403: set_term_funcp2((change_p), (tchange)) */
! 404:
! 405: /* This function should be called before any graphic code can be used... */
! 406: void
! 407: set_term_funcp2(FUNC_PTR change_p, TSET_FP tchange)
! 408: {
! 409: SET_OUTFILE;
! 410: my_term_ftable.change_term_p = change_p;
! 411: my_term_ftable.loaded = 1;
! 412: if (tchange) {
! 413: my_term_ftable.term_set_outputp = tchange;
! 414: }
! 415: }
! 416:
! 417: /* Used from Math::Pari */
! 418: void
! 419: set_term_funcp3(FUNC_PTR change_p, void *term_p, TSET_FP tchange)
! 420: {
! 421: set_term_funcp2(change_p, tchange);
! 422: }
! 423:
! 424: void
! 425: set_term_ftable(struct t_ftable *p)
! 426: {
! 427: SET_OUTFILE;
! 428: my_term_ftablep = p;
! 429: }
! 430:
! 431: #else /* !DYNAMIC_PLOTTING */
! 432:
! 433: extern struct termentry term_tbl[];
! 434:
! 435: # define my_change_term change_term
! 436: # define my_term_tbl term_tbl
! 437:
! 438: extern void term_set_output(char *s);
! 439: extern void term_start_plot(void);
! 440: extern void term_end_plot(void);
! 441: extern void term_start_multiplot(void);
! 442: extern void term_end_multiplot(void);
! 443: extern void term_init(void);
! 444: extern void list_terms(void);
! 445:
! 446: static void
! 447: plotsizes_scale(double x, double y) { xsize=x; ysize=y; }
! 448:
! 449: static double
! 450: plotsizes_get(int flag) { return (flag ? ysize : xsize); }
! 451:
! 452: struct t_ftable my_term_ftable =
! 453: {
! 454: 1, (FUNC_PTR)&change_term, &term_set_output,
! 455: &plotsizes_scale, &plotsizes_get,
! 456: {&term_start_plot, &term_end_plot,
! 457: &term_start_multiplot, &term_end_multiplot, &term_init, &list_terms}
! 458: };
! 459:
! 460: struct t_ftable *get_term_ftable() { SET_OUTFILE; return &my_term_ftable; }
! 461: void set_term_ftable() { SET_OUTFILE; }
! 462:
! 463:
! 464: void
! 465: set_term_funcp3(FUNC_PTR change_p, void *term_p, TSET_FP tchange)
! 466: {
! 467: SET_OUTFILE;
! 468: my_term_ftable.change_term_p = change_p;
! 469: my_term_ftable.loaded = 1;
! 470: if (tchange) {
! 471: my_term_ftable.term_set_outputp = tchange;
! 472: }
! 473: }
! 474:
! 475: #define scaled_xmax() ((int)termprop(xmax)*xsize)
! 476: #define scaled_ymax() ((int)termprop(ymax)*ysize)
! 477:
! 478: #endif /* !DYNAMIC_PLOTTING */
! 479:
! 480: #define int_get_term_ftable() ((IV)get_term_ftable())
! 481: #define int_set_term_ftable(a) (v_set_term_ftable((void*)a))
! 482:
! 483: void
! 484: v_set_term_ftable(void *a) { set_term_ftable((struct t_ftable*)a); }
! 485:
! 486: void
! 487: setup_gpshim(void) { SET_OUTFILE; }
! 488:
! 489: #ifdef SET_OPTIONS_FROM_STRING
! 490: /* This sets the tokens for the options */
! 491: void
! 492: set_tokens_string(char *start)
! 493: {
! 494: char *s = start;
! 495: char *tstart;
! 496: int is_real, is_integer, has_exp;
! 497:
! 498: num_tokens = 0;
! 499: while (num_tokens < MAX_TOKENS) {
! 500: while (*s == ' ' || *s == '\t' || *s == '\n')
! 501: s++;
! 502: if (!*s)
! 503: return;
! 504: tstart = s;
! 505: if (*s == ',') {
! 506: s++;
! 507: is_integer = is_real = 0;
! 508: goto process;
! 509: }
! 510: is_integer = is_real = ((*s) != 0);
! 511: if (*s == '+' || *s == '-')
! 512: s++;
! 513: has_exp = 0;
! 514: while (*s && !(*s == ' ' || *s == '\t' || *s == '\n')) {
! 515: if (!(*s <= '9' && *s >= '0')) {
! 516: if (*s == '.') {
! 517: if (!is_integer)
! 518: is_real = 0;
! 519: else if (is_integer == 1 && !(s[1] <= '9' && s[1] >= '0'))
! 520: is_real = 0;
! 521: } else if (*s == 'e' || *s == 'E') {
! 522: if (has_exp)
! 523: is_real = 0;
! 524: has_exp = 1;
! 525: if (s[1] == '+' || s[1] == '-')
! 526: s++;
! 527: } else if (*s == ',' && (is_integer || is_real))
! 528: break;
! 529: else
! 530: is_real = 0;
! 531: is_integer = 0;
! 532: } else if (is_integer)
! 533: is_integer++;
! 534: s++;
! 535: }
! 536: process:
! 537: token[num_tokens].start_index = tstart - input_line;
! 538: token[num_tokens].length = s - tstart;
! 539: if (is_integer) {
! 540: token[num_tokens].is_token = 0;
! 541: token[num_tokens].l_val.type = INTGR;
! 542: token[num_tokens].l_val.v.int_val = atoi(tstart);
! 543: } else if (is_real) {
! 544: token[num_tokens].is_token = 0;
! 545: token[num_tokens].l_val.type = CMPLX;
! 546: token[num_tokens].l_val.v.cmplx_val.real = atof(tstart);
! 547: token[num_tokens].l_val.v.cmplx_val.imag = 0;
! 548: } else {
! 549: token[num_tokens].is_token = 1;
! 550: }
! 551: num_tokens++;
! 552: }
! 553: if (num_tokens >= MAX_TOKENS) {
! 554: char buf[80];
! 555: sprintf(buf, "panic: more than %d tokens for options", MAX_TOKENS);
! 556: croak(buf);
! 557: }
! 558: }
! 559:
! 560: void
! 561: set_options_from(char *s)
! 562: {
! 563: char *o = input_line;
! 564:
! 565: input_line = s; /* for error reports */
! 566: set_tokens_string(s);
! 567: options();
! 568: input_line = o;
! 569: c_token = num_tokens = 0;
! 570: }
! 571: #endif
! 572:
! 573: #ifdef GNUPLOT_OUTLINE_STDOUT
! 574: int
! 575: StartOutput() {}
! 576:
! 577: int
! 578: EndOutput() {}
! 579:
! 580: int
! 581: OutLine(char *s)
! 582: {
! 583: return fprintf(stdout, "%s", s);
! 584: }
! 585: #endif
! 586:
! 587: #ifdef __cplusplus
! 588: }
! 589: #endif
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>