mosy.c
来自「ftam等标准协议服务器和客户端的源代码。」· C语言 代码 · 共 1,355 行 · 第 1/2 页
C
1,355 行
/* mosy.c - Managed Object Syntax-compiler (yacc-based) */#ifndef lintstatic char *rcsid = "$Header: /xtel/isode/isode/others/mosy/RCS/mosy.c,v 9.0 1992/06/16 12:42:35 isode Rel $";#endif/* * $Header: /xtel/isode/isode/others/mosy/RCS/mosy.c,v 9.0 1992/06/16 12:42:35 isode Rel $ * * * $Log: mosy.c,v $ * Revision 9.0 1992/06/16 12:42:35 isode * Release 8.0 * *//* * NOTICE * * Acquisition, use, and distribution of this module and related * materials are subject to the restrictions of a license agreement. * Consult the Preface in the User's Manual for the full terms of * this agreement. * */#include <ctype.h>#include <stdio.h>#include <varargs.h>#include "mosy-defs.h"/* DATA */int Cflag = 0; /* mosy */int dflag = 0;int Pflag = 0; /* pepy compat... */int doexternals;static int linepos = 0;static int mflag = 0;static int mosydebug = 0;static int sflag = 0;static int delay = 0;static int iflag = 0;static char *eval = NULLCP;char *mymodule = "";OID mymoduleid;int yysection = NULL;char *yyencpref = "none";char *yydecpref = "none";char *yyprfpref = "none";char *yyencdflt = "none";char *yydecdflt = "none";char *yyprfdflt = "none";static char *yymode = "";static char autogen[BUFSIZ];char *sysin = NULLCP;static char sysout[BUFSIZ];/* */typedef struct yoi { char *yi_name; YV yi_value;} yoi, *OI;#define NULLOI ((OI) 0)typedef struct yot { char *yo_name; YP yo_syntax; YV yo_value; char *yo_access; char *yo_status; char *yo_descr; char *yo_refer; YV yo_index; YV yo_defval;} yot, *OT;#define NULLOT ((OT) 0)typedef struct ytt { char *yt_name; YV yt_enterprise; int yt_number; YV yt_vars; char *yt_descr; char *yt_refer;} ytt, *TT;#define NULLTT ((TT) 0)/* */typedef struct symlist { char *sy_encpref; char *sy_decpref; char *sy_prfpref; char *sy_module; char *sy_name; union { OT sy_un_yo; TT sy_un_yt; OI sy_un_yi; YP sy_un_yp; } sy_un;#define sy_yo sy_un.sy_un_yo#define sy_yt sy_un.sy_un_yt#define sy_yi sy_un.sy_un_yi#define sy_yp sy_un.sy_un_yp struct symlist *sy_next;} symlist, *SY;#define NULLSY ((SY) 0)static SY myidentifiers = NULLSY;static SY myobjects = NULLSY;static SY mytraps = NULLSY;static SY mytypes = NULLSY;SY new_symbol (), add_symbol ();char *id2str ();YP lookup_type ();char *val2str ();OI lookup_identifier ();OT lookup_object ();/* MAIN *//* ARGSUSED */main (argc, argv, envp)int argc;char **argv, **envp;{ register char *cp, *sp; fprintf (stderr, "%s\n", mosyversion); sysout[0] = NULL; for (argc--, argv++; argc > 0; argc--, argv++) { cp = *argv; if (strcmp (cp, "-i") == 0) { iflag++; continue; } if (strcmp (cp, "-d") == 0) { dflag++; continue; } if (strcmp (cp, "-m") == 0) { mflag++; continue; } if (strcmp (cp, "-o") == 0) { if (sysout[0]) { fprintf (stderr, "too many output files\n"); exit (1); } argc--, argv++; if ((cp = *argv) == NULL || (*cp == '-' && cp[1] != NULL)) goto usage; (void) strcpy (sysout, cp); continue; } if (strcmp (cp, "-s") == 0) { sflag++; continue; } if (sysin) {usage: ; fprintf (stderr, "usage: mosy [-d] [-o module.defs] [-s] module.my\n"); exit (1); } if (*cp == '-') { if (*++cp != NULL) goto usage; sysin = ""; } sysin = cp; if (sysout[0]) continue; if (sp = rindex (cp, '/')) sp++; if (sp == NULL || *sp == NULL) sp = cp; sp += strlen (cp = sp) - 3; if (sp > cp && strcmp (sp, ".my") == 0) (void) sprintf (sysout, "%.*s.defs", sp - cp, cp); else (void) sprintf (sysout, "%s.defs", cp); } switch (mosydebug = (cp = getenv ("MOSYTEST")) && *cp ? atoi (cp) : 0) { case 2: yydebug++; /* fall */ case 1: sflag++; /* .. */ case 0: break; } if (sysin == NULLCP) sysin = ""; if (*sysin && freopen (sysin, "r", stdin) == NULL) { fprintf (stderr, "unable to read "), perror (sysin); exit (1); } if (strcmp (sysout, "-") == 0) sysout[0] = NULL; if (*sysout && freopen (sysout, "w", stdout) == NULL) { fprintf (stderr, "unable to write "), perror (sysout); exit (1); } if (cp = index (mosyversion, ')')) for (cp++; *cp != ' '; cp++) if (*cp == NULL) { cp = NULL; break; } if (cp == NULL) cp = mosyversion + strlen (mosyversion); (void) sprintf (autogen, "%*.*s", cp - mosyversion, cp - mosyversion, mosyversion); printf ("-- automatically generated by %s, do not edit!\n\n", autogen); initoidtbl (); exit (yyparse ()); /* NOTREACHED */}/* ERRORS */yyerror (s)register char *s;{ yyerror_aux (s); if (delay) { delay = -1; return; } if (*sysout) (void) unlink (sysout); exit (1);}#ifndef lintwarning (va_alist)va_dcl{ char buffer[BUFSIZ]; char buffer2[BUFSIZ]; char *cp; va_list ap; va_start (ap); _asprintf (buffer, NULLCP, ap); va_end (ap); (void) sprintf (buffer2, "Warning: %s", buffer); yyerror_aux (buffer2);}#else/* VARARGS1 */warning (fmt)char *fmt;{ warning (fmt);}#endifstatic yyerror_aux (s)register char *s;{ if (linepos) fprintf (stderr, "\n"), linepos = 0; if (eval) fprintf (stderr, "%s %s:\n ", yymode, eval); else fprintf (stderr, "line %d: ", yylineno); fprintf (stderr, "%s\n", s); if (!eval) fprintf (stderr, "last token read was \"%s\"\n", yytext);}/* */#ifndef lintmyyerror (va_alist)va_dcl{ char buffer[BUFSIZ]; va_list ap; va_start (ap); _asprintf (buffer, NULLCP, ap); va_end (ap); yyerror (buffer);}#endif/* */yywrap () { if (linepos) fprintf (stderr, "\n"), linepos = 0; return 1;}/* *//* ARGSUSED */yyprint (s, f, top)char *s;int f, top;{}static yyprint_aux (s, mode)char *s, *mode;{ int len; static int nameoutput = 0; static int outputlinelen = 79; if (sflag) return; if (strcmp (yymode, mode)) { if (linepos) fprintf (stderr, "\n\n"); fprintf (stderr, "%s", mymodule); nameoutput = (linepos = strlen (mymodule)) + 1; fprintf (stderr, " %ss", yymode = mode); linepos += strlen (yymode) + 1; fprintf (stderr, ":"); linepos += 2; } len = strlen (s); if (linepos != nameoutput) if (len + linepos + 1 > outputlinelen) fprintf (stderr, "\n%*s", linepos = nameoutput, ""); else fprintf (stderr, " "), linepos++; fprintf (stderr, "%s", s); linepos += len;}/* PASS1 */pass1 (){ printf ("-- object definitions compiled from %s", mymodule); if (mymoduleid) printf (" %s", oidprint(mymoduleid)); printf ("\n\n");}/* */pass1_oid (mod, id, value)char *mod, *id;YV value;{ register SY sy; register OI yi; if ((yi = (OI) calloc (1, sizeof *yi)) == NULLOI) yyerror ("out of memory"); yi -> yi_name = id; yi -> yi_value = value; if (mosydebug) { if (linepos) fprintf (stderr, "\n"), linepos = 0; fprintf (stderr, "%s.%s\n", mod ? mod : mymodule, id); print_yi (yi, 0); fprintf (stderr, "--------\n"); } else yyprint_aux (id, "identifier"); sy = new_symbol (NULLCP, NULLCP, NULLCP, mod, id); sy -> sy_yi = yi; myidentifiers = add_symbol (myidentifiers, sy);}/* */pass1_obj (mod, id, syntax, value, aname, sname, descr, refer, idx, defval)char *mod, *id, *aname, *sname, *descr, *refer;YP syntax;YV value, idx, defval;{ register SY sy; register OT yo; if ((yo = (OT) calloc (1, sizeof *yo)) == NULLOT) yyerror ("out of memory"); yo -> yo_name = id; yo -> yo_syntax = syntax; yo -> yo_value = value; yo -> yo_access = aname; yo -> yo_status = sname; yo -> yo_descr = descr; yo -> yo_refer = refer; yo -> yo_index = idx; yo -> yo_defval = defval; if (mosydebug) { if (linepos) fprintf (stderr, "\n"), linepos = 0; fprintf (stderr, "%s.%s\n", mod ? mod : mymodule, id); print_yo (yo, 0); fprintf (stderr, "--------\n"); } else yyprint_aux (id, "object"); sy = new_symbol (NULLCP, NULLCP, NULLCP, mod, id); sy -> sy_yo = yo; myobjects = add_symbol (myobjects, sy);}/* */pass1_trap (mod, id, enterprise, number, vars, descr, refer)char *mod, *id;YV enterprise;int number;YV vars;char *descr, *refer;{ register SY sy; register TT yt; if ((yt = (TT) calloc (1, sizeof *yt)) == NULLTT) yyerror ("out of memory"); yt -> yt_name = id; yt -> yt_enterprise = enterprise; yt -> yt_number = number; yt -> yt_vars = vars; yt -> yt_descr = descr; yt -> yt_refer = refer; if (mosydebug) { if (linepos) fprintf (stderr, "\n"), linepos = 0; fprintf (stderr, "%s.%s\n", mod ? mod : mymodule, id); print_yt (yt, 0); fprintf (stderr, "--------\n"); } else yyprint_aux (id, "trap"); sy = new_symbol (NULLCP, NULLCP, NULLCP, mod, id); sy -> sy_yt = yt; mytraps = add_symbol (mytraps, sy);}/* */pass1_type (encpref, decpref, prfpref, mod, id, yp)register char *encpref, *decpref, *prfpref, *mod, *id;register YP yp;{ register SY sy; if (dflag && lookup_type (mod, id)) /* no duplicate entries, please... */ return; if (mosydebug) { if (linepos) fprintf (stderr, "\n"), linepos = 0; fprintf (stderr, "%s.%s\n", mod ? mod : mymodule, id); print_type (yp, 0); fprintf (stderr, "--------\n"); } else if (!(yp -> yp_flags & YP_IMPORTED)) yyprint_aux (id, "type"); sy = new_symbol (encpref, decpref, prfpref, mod, id); sy -> sy_yp = yp; mytypes = add_symbol (mytypes, sy);}/* PASS2 */pass2 () { register SY sy; if (!sflag) (void) fflush (stderr); delay = 1; yymode = "identifier"; for (sy = myidentifiers; sy; sy = sy -> sy_next) { if (sy -> sy_module == NULLCP) yyerror ("no module name associated with symbol"); do_id (sy -> sy_yi, eval = sy -> sy_name); } if (myidentifiers) printf ("\n"); yymode = "object"; for (sy = myobjects; sy; sy = sy -> sy_next) { if (sy -> sy_module == NULLCP) yyerror ("no module name associated with symbol"); do_obj1 (sy -> sy_yo, eval = sy -> sy_name); } if (myobjects) printf ("\n\n"); yymode = "trap"; for (sy = mytraps; sy; sy = sy -> sy_next) { if (sy -> sy_module == NULLCP) yyerror ("no module name associated with symbol"); do_trap1 (sy -> sy_yt, eval = sy -> sy_name); } (void) fflush (stdout); if (ferror (stdout)) myyerror ("write error - %s", sys_errname (errno)); if (!iflag && delay < 0) exit (1); delay = 0;}/* *//* ARGSUSED */static do_id (yi, id)register OI yi;char *id;{ printf ("%-20s %s\n", yi -> yi_name, id2str (yi -> yi_value));}/* *//* ARGSUSED */static do_obj1 (yo, id)register OT yo;char *id;{ register YP yp, yz; register YV yv; { register char *cp; for (cp = yo -> yo_name; *cp; cp++) if (*cp == '-') { warning ("object type %s contains a `-' in its descriptor", yo -> yo_name); break; } } printf ("%-20s %-16s ", yo -> yo_name, id2str (yo -> yo_value)); if ((yp = yo -> yo_syntax) == NULLYP) { yyerror ("no syntax associated with object type"); return; }again: ; switch (yp -> yp_code) { case YP_INTLIST: for (yv = yp -> yp_value; yv; yv = yv -> yv_next) if (yv -> yv_code != YV_NUMBER) yyerror ("value of enumerated INTEGER is not a number"); else if (yv -> yv_number == 0) yyerror ("value of enumerated INTEGER is zero"); for (yv = yp -> yp_value; yv; yv = yv -> yv_next) { register YV v; for (v = yv -> yv_next; v; v = v -> yv_next) if (yv -> yv_number == v -> yv_number) myyerror ("duplicate values in enumerated INTEGER: %d", yv -> yv_number); if (yv -> yv_flags & YV_NAMED) for (v = yv -> yv_next; v; v = v -> yv_next) if ((v -> yv_flags & YV_NAMED) && strcmp (yv -> yv_named, v -> yv_named) == 0) myyerror ("duplicate tags in enumerated INTEGER: %s", yv -> yv_named); } /* and fall... */ case YP_INT: id = "INTEGER"; break; case YP_OCT: id = "OctetString";
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?