00001
00002
00003
00004
00005 static char *rcsid="@(#)$Id$";
00006
00007 #include "eus.h"
00008 #include <ctype.h>
00009
00010 #if vxworks
00011 #undef READ
00012 #else
00013 #include <fcntl.h>
00014 #endif
00015
00016 extern int errno;
00017 extern enum ch_type chartype[256];
00018 extern pointer QREADTABLE,QTERMIO, oblabels;
00019 extern byte *current_syntax[MAXTHREAD];
00020 extern int written_count[MAXTHREAD];
00021 extern pointer read_delimited_list(context*,pointer,int,char *);
00022
00023 pointer OPENFILE(ctx,n,argv)
00024 register context *ctx;
00025 int n;
00026 register pointer argv[];
00027 { pointer s;
00028 extern pointer openfile();
00029 s=openfile(ctx,(char*)get_string(argv[0]), ckintval(argv[1]),
00030 ckintval(argv[2]),ckintval(argv[3]));
00031 if (s==0) return(makeint(errno));
00032 return(s);}
00033
00034 pointer CLOSE(ctx,n,argv)
00035 register context *ctx;
00036 int n;
00037 pointer argv[];
00038 { register pointer s=argv[0];
00039 if (n!=1) error(E_MISMATCHARG);
00040 if (isiostream(s)) {
00041 if (closestream(s->c.iostream.in)<0) return(NIL);
00042 if (closestream(s->c.iostream.out)<0) return(NIL);
00043 return(T);}
00044 else if (isfilestream(s)) {
00045 if (closestream(s)<0) return(NIL);
00046 return(T);}
00047 else error(E_USER,(pointer)"file stream expected");}
00048
00049 pointer getoutstream(ctx,n,strm)
00050 context *ctx;
00051 int n;
00052 register pointer strm;
00053 { if (n==1 || strm==NIL) strm=Spevalof(QSTDOUT);
00054 if (strm==T) strm=Spevalof(QTERMIO);
00055 if (isiostream(strm)) strm=strm->c.iostream.out;
00056 if (!isstream(strm)) error(E_STREAM);
00057 if (strm->c.stream.direction!=K_OUT) error(E_IODIRECTION);
00058 return(strm);}
00059
00060 pointer getinstream(ctx,n,strm)
00061 context *ctx;
00062 int n;
00063 register pointer strm;
00064 { if (n<1 || strm==NIL) strm=Spevalof(QSTDIN);
00065 if (strm==T) strm=Spevalof(QTERMIO);
00066 if (isiostream(strm)) strm=strm->c.iostream.in;
00067 if (!isstream(strm)) error(E_STREAM);
00068 if (strm->c.stream.direction!=K_IN) error(E_IODIRECTION);
00069 return(strm);}
00070
00071
00072
00073 pointer PRINT(ctx,n,argv)
00074 register context *ctx;
00075 int n;
00076 pointer argv[];
00077 { pointer s;
00078 int osf;
00079 ckarg2(1,2);
00080 osf=ctx->slashflag;
00081 ctx->slashflag=0;
00082 prinx(ctx,argv[0],s=getoutstream(ctx,n,argv[1])); terpri(s);
00083 ctx->slashflag=osf;
00084 return(argv[0]);}
00085
00086 pointer PRIN1(ctx,n,argv)
00087 register context *ctx;
00088 int n;
00089 pointer argv[];
00090 { ckarg2(1,2);
00091 int osf;
00092 osf=ctx->slashflag;
00093 ctx->slashflag=0;
00094 prinx(ctx,argv[0],getoutstream(ctx,n,argv[1]));
00095 ctx->slashflag=osf;
00096 return(argv[0]);}
00097
00098 pointer PRINC(ctx,n,argv)
00099 register context *ctx;
00100 int n;
00101 pointer argv[];
00102 { int osf;
00103 ckarg2(1,2);
00104 osf=ctx->slashflag;
00105 ctx->slashflag=1;
00106 prinx(ctx,argv[0],getoutstream(ctx,n,argv[1]));
00107 ctx->slashflag=osf;
00108 return(argv[0]);}
00109
00110 pointer TERPRI(ctx,n,argv)
00111 register context *ctx;
00112 int n;
00113 pointer argv[];
00114 { pointer strm;
00115 ckarg2(0,1);
00116 strm=getoutstream(ctx,n+1,argv[0]);
00117 terpri(strm);
00118 return(NIL);}
00119
00120 static int prsize[MAXTHREAD];
00121
00122 void prntsize(s,lim)
00123 register pointer s;
00124 int lim;
00125 { char buf[16];
00126 register int i,n,etype;
00127 numunion nu;
00128 if (prsize[thr_self()]>=lim) return;
00129 else if (isint(s)) { sprintf(buf,"%ld",intval(s)); prsize[thr_self()]+=strlen(buf);}
00130 else if (isflt(s)) prsize[thr_self()]+=7;
00131 else if (piscons(s)) {
00132 if (ccar(s)==QUOTE && islist(ccdr(s)) && ccdr(ccdr(s))==NIL) {
00133 prsize[thr_self()]++; prntsize(ccar(ccdr(s)),lim);}
00134 else {
00135 prsize[thr_self()]+=2;
00136 while (islist(s)) {
00137 prntsize(ccar(s),lim);
00138 if (prsize[thr_self()]>lim) return;
00139 s=ccdr(s);
00140 if (s!=NIL) prsize[thr_self()]++;}
00141 if (s!=NIL) { prntsize(s,lim); prsize[thr_self()]+=2;}}}
00142 else if (pisstring(s)) prsize[thr_self()]+=strlength(s);
00143 else if (pissymbol(s)) prsize[thr_self()]+=strlength(s->c.sym.pname);
00144 else if (pisvector(s)) {
00145 n=vecsize(s); i=0; etype=elmtypeof(s);
00146 switch(etype) {
00147 case ELM_BIT: case ELM_CHAR: case ELM_FOREIGN: prsize[thr_self()]+=2+n; break;
00148 case ELM_BYTE: prsize[thr_self()]+=20; break;
00149 case ELM_FLOAT: case ELM_INT: prsize[thr_self()]++;
00150 case ELM_POINTER:
00151 prsize[thr_self()]+=3;
00152 while (i<n) {
00153 if (etype==ELM_FLOAT) prntsize(makeflt(s->c.fvec.fv[i]),lim);
00154 else if (etype==ELM_INT) prntsize(makeint(s->c.ivec.iv[i]),lim);
00155 else prntsize(s->c.vec.v[i],lim);
00156 if (prsize[thr_self()]>lim) return;
00157 prsize[thr_self()]++; i++;}
00158 break;} }
00159 else prsize[thr_self()]+=strlength(classof(s)->c.cls.name->c.sym.pname)+12;}
00160
00161 pointer PRNTSIZE(ctx,n,argv)
00162 register context *ctx;
00163 int n;
00164 pointer argv[];
00165 { int lim;
00166 prsize[thr_self()]=0;
00167 ckarg2(1,2);
00168 if (n==2) lim=ckintval(argv[1]); else lim=256;
00169 prntsize(argv[0],lim);
00170 return(makeint(prsize[thr_self()]));}
00171
00172 pointer READ(ctx,n,argv)
00173 register context *ctx;
00174 int n;
00175 pointer argv[];
00176 { pointer strm,eoferrorp=T,eofvalue=NIL,result,recursivep=NIL;
00177 ckarg2(0,4);
00178 strm=getinstream(ctx,n,argv[0]);
00179 if (n>=2) eoferrorp=argv[1];
00180 if (n>=3) eofvalue=argv[2];
00181 if (n==4) recursivep=argv[3];
00182 result=reader(ctx,strm,recursivep);
00183 if (result==(pointer)EOF)
00184 if (eoferrorp==NIL) return(eofvalue);
00185 else error(E_EOF);
00186 return(result);}
00187
00188 pointer READ_DELIMITED_LIST(ctx,n,argv)
00189 register context *ctx;
00190 int n;
00191 pointer argv[];
00192 { pointer strm,result,recursivep=NIL;
00193 int delim_char;
00194 char token[1024];
00195
00196 ckarg2(1,3);
00197 delim_char=ckintval(argv[0]);
00198 strm=getinstream(ctx,n-1,argv[1]);
00199 if (n==3) recursivep=argv[2];
00200
00201 current_syntax[thr_self()]=Spevalof(QREADTABLE)->c.rdtab.syntax->c.str.chars;
00202 if (recursivep==NIL) {
00203 pointer_update(oblabels->c.lab.next,NIL);
00204 result=read_delimited_list(ctx,strm,delim_char,token);
00205 pointer_update(oblabels->c.lab.next,NIL);}
00206 else result=read_delimited_list(ctx,strm,delim_char,token);
00207 return(result);}
00208
00209 pointer READLINE(ctx,n,argv)
00210 register context *ctx;
00211 int n;
00212 pointer argv[];
00213 { register pointer strm;
00214 pointer eoferrorp=T,eofvalue=NIL;
00215 byte cb[8192];
00216 register int i=0,ch;
00217 ckarg2(0,3);
00218 strm=getinstream(ctx,n,argv[0]);
00219 if (n>=2) eoferrorp=argv[1];
00220 if (n==3) eofvalue=argv[2];
00221 while (i<8192) {
00222 ch=readch(strm);
00223 if (ch=='\n') break;
00224 else if (ch==EOF) {
00225 if (i>0) break;
00226 if (eoferrorp==NIL) return(eofvalue);
00227 else error(E_EOF);}
00228 cb[i++]=ch;}
00229 if (cb[i-1]=='\r' && (i>=1)) i=i-1;
00230 return(makestring((char *)cb,i));}
00231
00232 pointer READCH(ctx,n,argv)
00233 register context *ctx;
00234 register int n;
00235 register pointer argv[];
00236 { pointer strm,eoferrorp=T,eofvalue=NIL;
00237 register eusinteger_t result;
00238 ckarg2(0,3);
00239 strm=getinstream(ctx,n,argv[0]);
00240 if (n>=2) eoferrorp=argv[1];
00241 if (n==3) eofvalue=argv[2];
00242 result=readch(strm);
00243 if (result==EOF)
00244 if (eoferrorp==NIL) return(eofvalue);
00245 else error(E_EOF);
00246 return(makeint(result));}
00247
00248 pointer UNREADCH(ctx,n,argv)
00249 register context *ctx;
00250 int n;
00251 register pointer argv[];
00252 { pointer strm;
00253 byte ch;
00254 ckarg2(1,2);
00255 strm=getinstream(ctx,n-1,argv[1]);
00256 ch=ckintval(argv[0]);
00257 unreadch(strm,ch);
00258 return(argv[0]);}
00259
00260 pointer PEEKCH(ctx,n,argv)
00261 register context *ctx;
00262 int n;
00263 pointer argv[];
00264 { pointer strm,eoferrorp=T,eofvalue=NIL;
00265 eusinteger_t result;
00266 ckarg2(0,3);
00267 strm=getinstream(ctx,n,argv[0]);
00268 if (n>=2) eoferrorp=argv[1];
00269 if (n==3) eofvalue=argv[2];
00270 result=readch(strm);
00271 if (result==EOF)
00272 if (eoferrorp==NIL) return(eofvalue);
00273 else error(E_EOF);
00274 unreadch(strm,result);
00275 return(makeint(result));}
00276
00277 pointer FINOUT(ctx,n,argv)
00278 register context *ctx;
00279 int n;
00280 pointer argv[];
00281 { pointer strm;
00282 strm=getoutstream(ctx,n+1,argv[0]);
00283 flushstream(strm);
00284 return(NIL);}
00285
00286 pointer WRTBYTE(ctx,n,argv)
00287 register context *ctx;
00288 int n;
00289 pointer *argv;
00290 { register pointer bytes,strm;
00291 ckarg(2);
00292 strm=getoutstream(ctx,n,argv[1]);
00293 bytes=argv[0];
00294 if (islist(bytes))
00295 while (islist(bytes)) {
00296 writech(strm,ckintval(ccar(bytes)));
00297 bytes=ccdr(bytes);}
00298 else writech(strm,ckintval(bytes));
00299 return(argv[0]);}
00300
00301 pointer WRTWORD(ctx,n,argv)
00302 register context *ctx;
00303 int n;
00304 pointer *argv;
00305 { register pointer bytes,strm;
00306 union {
00307 short s;
00308 char b[2];} buf;
00309 ckarg(2);
00310 strm=getoutstream(ctx,n,argv[1]);
00311 bytes=argv[0];
00312 if (islist(bytes))
00313 while (islist(bytes)) {
00314 buf.s=ckintval(ccar(bytes));
00315 writestr(strm,(byte *)buf.b,2);
00316 bytes=ccdr(bytes);}
00317 else {
00318 buf.s=ckintval(bytes);
00319 writestr(strm,(byte *)buf.b,2);}
00320 return(argv[0]);}
00321
00322 pointer WRTLONG(ctx,n,argv)
00323 register context *ctx;
00324 int n;
00325 pointer *argv;
00326 { register pointer bytes,strm;
00327 union {
00328 int i;
00329 byte b[4];} buf;
00330 ckarg(2);
00331 strm=getoutstream(ctx,n,argv[1]);
00332 bytes=argv[0];
00333 if (islist(bytes))
00334 while (islist(bytes)) {
00335 buf.i=bigintval(ccar(bytes));
00336 writestr(strm,buf.b,4);
00337 bytes=ccdr(bytes);}
00338 else {
00339 buf.i=bigintval(bytes);
00340 writestr(strm,buf.b,4);}
00341 return(argv[0]);}
00342
00343 pointer SETMACROCH(ctx,n,argv)
00344 register context *ctx;
00345 int n;
00346 pointer argv[];
00347 { int ch;
00348 pointer nontermp=NIL,rdtable;
00349 ckarg2(2,4);
00350 if (isstring(argv[0])) ch=argv[0]->c.str.chars[0];
00351 else ch=ckintval(argv[0]);
00352 if (ch<0 || 256<ch) error(E_CHARRANGE);
00353 if (n>=3) nontermp=argv[2];
00354 if (n==4) rdtable=argv[3];
00355 else rdtable=Spevalof(QREADTABLE);
00356 if (!isreadtable(rdtable)) error(E_USER,(pointer)"readtable expected");
00357 pointer_update(rdtable->c.rdtab.macro->c.vec.v[ch],argv[1]);
00358 if (argv[1]==NIL) rdtable->c.rdtab.syntax->c.str.chars[ch]=(byte)chartype[ch];
00359 else if (nontermp==NIL) rdtable->c.rdtab.syntax->c.str.chars[ch]=(int)ch_termmacro;
00360 else rdtable->c.rdtab.syntax->c.str.chars[ch]=(int)ch_nontermacro;
00361 return(T);}
00362
00363 pointer GETMACROCH(ctx,n,argv)
00364 register context *ctx;
00365 pointer argv[];
00366 { pointer rdtable;
00367 ckarg2(1,2);
00368 if (n==2) rdtable=argv[1];
00369 else rdtable=Spevalof(QREADTABLE);
00370 if (!isreadtable(rdtable)) error(E_USER,(pointer)"readtable expected");
00371 return(rdtable->c.rdtab.macro->c.vec.v[max(0,min(255,ckintval(argv[0])))]);}
00372
00373 pointer SETDISPMACRO(ctx,n,argv)
00374 register context *ctx;
00375 int n;
00376 register pointer argv[];
00377 { int ch;
00378 pointer rdtable,func;
00379 ckarg2(3,4);
00380 if (isstring(argv[1])) ch=argv[1]->c.str.chars[0];
00381 else ch=ckintval(argv[1]);
00382 if (ch<0 || 256<ch) error(E_CHARRANGE);
00383 if (n==4) rdtable=argv[3];
00384 else rdtable=Spevalof(QREADTABLE);
00385 if (!isreadtable(rdtable)) error(E_USER,(pointer)"readtable expected");
00386 pointer_update(rdtable->c.rdtab.dispatch->c.vec.v[ch],argv[2]);
00387 return(T);}
00388
00389 pointer GETDISPMACRO(ctx,n,argv)
00390 register context *ctx;
00391 int n;
00392 pointer argv[];
00393 { int ch;
00394 pointer rdtable,func;
00395 ckarg2(2,3);
00396 if (isstring(argv[1])) ch=argv[1]->c.str.chars[0];
00397 else ch=ckintval(argv[1]);
00398 if (ch<0 || 256<ch) error(E_CHARRANGE);
00399 if (n==3) rdtable=argv[2];
00400 else rdtable=Spevalof(QREADTABLE);
00401 if (!isreadtable(rdtable)) error(E_USER,(pointer)"readtable expected");
00402 func=rdtable->c.rdtab.dispatch->c.vec.v[ch];
00403 return(func);}
00404
00405 pointer RESETREADTABLE(ctx,n,argv)
00406 register context *ctx;
00407 int n;
00408 pointer *argv;
00409 { initreader(ctx); return(T);}
00410
00411
00412
00413
00414
00415
00416
00417 #define nextcch() ((cx>=cmax)?(byte)((eusinteger_t)error(E_FORMATSTRING)):cstr[cx++])
00418
00419 #define nextfarg() ((fargx>=fargc)?(pointer)error(E_MISMATCHARG):fargv[fargx++])
00420
00421
00422
00423 pointer XFORMAT(ctx,n,argv)
00424 register context *ctx;
00425 int n;
00426 pointer argv[];
00427 {
00428 register pointer dest,a;
00429 register int i,j,px,l;
00430 int param[10],par;
00431 char buf[256];
00432 eusfloat_t fval;
00433 byte *cstr,cch;
00434 int cx,cmax;
00435 pointer *fargv, varg;
00436 int fargc,fargx;
00437 int wcount, osf;
00438 numunion nu;
00439 extern double fabs();
00440
00441 if (n<2) error(E_MISMATCHARG);
00442 dest=argv[0]; a=argv[1];
00443 if (!isstring(a)) error(E_NOSTRING);
00444 cx=0; cstr=a->c.str.chars; cmax=intval(a->c.str.length);
00445 fargv=argv; fargc=n; fargx=2;
00446
00447 if (dest==NIL) dest=(pointer)mkstream(ctx,K_OUT,makebuffer(64));
00448 else {
00449 if (dest==T) dest=Spevalof(QSTDOUT);
00450 if (isiostream(dest)) dest=dest->c.iostream.out;
00451 if (!isstream(dest)) error(E_STREAM);
00452 if (dest->c.stream.direction!=K_OUT) error(E_IODIRECTION);}
00453 vpush(dest);
00454
00455 written_count[thr_self()]=0;
00456 while (cx<cmax) {
00457 cch=nextcch();
00458 if (cch=='~') {
00459 cch=nextcch();
00460 px=0; param[0]=0; param[1]=1; param[2]=0;
00461 while (isdigit(cch)) {
00462 param[px]=0;
00463 while (isdigit(cch)) {
00464 param[px]=param[px]*10+(cch-'0');
00465 cch=nextcch();}
00466 px++;
00467 if (cch==',') cch=nextcch();}
00468 if (islower(cch)) cch=toupper(cch);
00469 if (cch=='V') {
00470 varg=nextfarg();
00471 param[px++]=ckintval(varg);
00472 cch=nextcch();
00473 if (islower(cch)) cch=toupper(cch);}
00474 switch(cch) {
00475 case 'A':
00476 osf=ctx->slashflag;
00477 ctx->slashflag=1;
00478 written_count[thr_self()]=0;
00479 prinx(ctx,(pointer)nextfarg(),dest);
00480 while (param[0]>written_count[thr_self()]) writech(dest,' ');
00481 ctx->slashflag=osf;
00482 break;
00483 case 'S':
00484 written_count[thr_self()]=0;
00485 prinx(ctx,nextfarg(),dest);
00486 while (param[0]>written_count[thr_self()]) writech(dest,' ');
00487 break;
00488 case 'D':
00489 a=nextfarg();
00490 printnum(ctx,a,dest,10,param[0],param[1]);
00491 break;
00492 case 'X':
00493 a=nextfarg();
00494 printnum(ctx,a,dest,16,param[0],param[1]);
00495 break;
00496 case 'O':
00497 a=nextfarg();
00498 printnum(ctx,a,dest,8,param[0],param[1]);
00499 break;
00500 case 'C':
00501 a=nextfarg();
00502 writech(dest,ckintval(a)); break;
00503 case 'F':
00504 a=nextfarg();
00505 fval=ckfltval(a);
00506 sprintf(buf,"%*.*f",param[0],param[1],fval);
00507 writestr(dest,(byte *)buf,strlen(buf)); break;
00508 case 'E':
00509 a=nextfarg();
00510 fval=ckfltval(a);
00511 sprintf(buf,"%*.*e",param[0],param[1],fval);
00512 writestr(dest,(byte *)buf,strlen(buf)); break;
00513 case 'G':
00514 a=nextfarg();
00515 fval=ckfltval(a);
00516 if (fval==0.0) writestr(dest,(byte *)"0.0",3);
00517 else {
00518 if (fabs(fval)<0.0001 || fabs(fval)>1.0e+05) {
00519 sprintf(buf,"%*.*e",param[0],param[1],fval); l=strlen(buf);}
00520 else {
00521 sprintf(buf,"%*.*f",param[0],param[1],fval);
00522 l=strlen(buf);
00523 while (l>2 && buf[l-1]=='0' && buf[l-2]!='.') l--;}
00524 writestr(dest,(byte *)buf,l); }
00525 break;
00526 case '%': case '&':
00527 for (j=0; j<=param[0]; j++) writech(dest,'\n');
00528 if (argv[0]!=NIL)
00529 if (flushstream(dest)!=0) error(E_USER,(pointer)"cannot flush stream");
00530 break;
00531 case '~':
00532 writech(dest,'~'); break;
00533 case 'T':
00534 writech(dest,9); break;;
00535 default: break;
00536 }
00537 }
00538 else writech(dest,cch);}
00539 if (argv[0]==NIL) {
00540 a=makestring((char *)dest->c.stream.buffer->c.str.chars,
00541 intval(dest->c.stream.count));
00542 vpop();
00543 return(a);}
00544 else { vpop(); return(NIL);}
00545 }
00546
00547 pointer SIGERROR(ctx,n,argv)
00548 register context *ctx;
00549 register int n;
00550 register pointer *argv;
00551 { register int i;
00552 pointer msg;
00553 pointer *argb=ctx->vsp;
00554 if (isstring(argv[0])) {
00555 vpush(NIL);
00556 for (i=0; i<n; i++) vpush(argv[i]);
00557 msg=XFORMAT(ctx,n+1,argb);
00558 error(E_USER,(pointer)(msg->c.str.chars),argv[1]);}
00559 else error((enum errorcode)(ckintval(argv[0])),argv[1]);}
00560
00561 pointer INSTALL_ERRHANDLER(ctx,n,argv)
00562 register context *ctx;
00563 register int n;
00564 register pointer *argv;
00565 { ckarg(1);
00566 ctx->errhandler=argv[0];
00567 return(argv[0]);}
00568
00569
00570 void lispio(ctx,mod)
00571 register context *ctx;
00572 pointer mod;
00573 {
00574 pointer_update(Spevalof(PACKAGE),syspkg);
00575 defun(ctx,"OPENFILE",mod,OPENFILE);
00576 pointer_update(Spevalof(PACKAGE),lisppkg);
00577
00578 defun(ctx,"CLOSE",mod,CLOSE);
00579 defun(ctx,"READ",mod,READ);
00580 defun(ctx,"READ-DELIMITED-LIST",mod,READ_DELIMITED_LIST);
00581 defun(ctx,"READ-LINE",mod,READLINE);
00582 defun(ctx,"READ-CHAR",mod,READCH);
00583 defun(ctx,"UNREAD-CHAR",mod,UNREADCH);
00584 defun(ctx,"PEEK-CHAR",mod,PEEKCH);
00585 defun(ctx,"PRINT",mod,PRINT);
00586 defun(ctx,"PRIN1",mod,PRIN1);
00587 defun(ctx,"PRINC",mod,PRINC);
00588 defun(ctx,"TERPRI",mod,TERPRI);
00589 defun(ctx,"PRINT-SIZE",mod,PRNTSIZE);
00590 defun(ctx,"FINISH-OUTPUT",mod,FINOUT);
00591 defun(ctx,"WRITE-BYTE",mod,WRTBYTE);
00592 defun(ctx,"WRITE-WORD",mod,WRTWORD);
00593 defun(ctx,"WRITE-LONG",mod,WRTLONG);
00594 defun(ctx,"SET-MACRO-CHARACTER",mod,SETMACROCH);
00595 defun(ctx,"GET-MACRO-CHARACTER",mod,GETMACROCH);
00596 defun(ctx,"SET-DISPATCH-MACRO-CHARACTER",mod,SETDISPMACRO);
00597 defun(ctx,"GET-DISPATCH-MACRO-CHARACTER",mod,GETDISPMACRO);
00598 defunpkg(ctx,"RESET-READTABLE",mod,RESETREADTABLE,syspkg);
00599 defun(ctx,"FORMAT",mod,XFORMAT);
00600 defun(ctx,"ERROR",mod,SIGERROR);
00601 defun(ctx,"INSTALL-ERROR-HANDLER",mod,INSTALL_ERRHANDLER);
00602 }
00603