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 + -
显示快捷键?