nrs_info.c

来自「ftam等标准协议服务器和客户端的源代码。」· C语言 代码 · 共 1,732 行 · 第 1/3 页

C
1,732
字号
int			  format;{	struct nrs_routes	* rt;	for (rt=routes; rt != (struct nrs_routes *)NULL; rt = rt->next)	{		if (format == READOUT)			ps_printf (ps, "\n---> ");		if (rt->cost)			pe_print (ps, rt->cost, format);		ps_printf (ps, "#");		if (rt->addr_info)			addr_info_print (ps, rt->addr_info, format);		if (rt->next != (struct nrs_routes *)NULL)			ps_printf (ps, "|");	}}static struct nrs_routes	* str2nrs_routes (orig)char * orig;{	struct nrs_routes	* result;	struct nrs_routes	**rt;	char			* copy;	char			* ptr_prev;	char			* ptr_next;	char			* ptr_mid;	result = (struct nrs_routes *) smalloc (sizeof (struct nrs_routes));	ptr_prev = SkipSpace(orig);	if ((ptr_prev == NULLCP) || ((*ptr_prev) == '\0'))	{		return ((struct nrs_routes *)NULL);	}	rt = &(result);	while ( (ptr_next=index (ptr_prev, '|')) != NULLCP)	{		*ptr_next = '\0';		ptr_next++;		(*rt) = (struct nrs_routes *) smalloc (sizeof (struct nrs_routes));		copy = strdup (ptr_prev);		if ( (ptr_mid=index (ptr_prev, '#')) == NULLCP)		{			parse_error ("separator(#) missing in nrs_route '%s'", copy);			free (copy);			free ((char *) result);			return ((struct nrs_routes *) NULL);		}		*ptr_mid = '\0';		ptr_mid++;		/*		* route-cost is not optional - use encoding of NULL		* when this element is absent		*/		if ((*ptr_prev) == '\0')		{			(*rt)->cost = pe_alloc (PE_CLASS_UNIV, PE_FORM_PRIM, PE_PRIM_NULL);		}		else if (((*rt)->cost = asnstr2pe (ptr_prev)) == NULLPE)		{			parse_error ("route-cost ASN malformed in nrs_route '%s'", copy);			free (copy);			free ((char *) result);			return ((struct nrs_routes *) NULL);		}		ptr_prev = SkipSpace (ptr_mid);		(*rt)->addr_info = str2addr_info (ptr_prev);		rt = &((*rt)->next);		ptr_prev = SkipSpace(ptr_next);	}	(*rt) = (struct nrs_routes *) smalloc (sizeof (struct nrs_routes));	copy = strdup (ptr_prev);	if ( (ptr_mid=index (ptr_prev, '#')) == NULLCP)	{		parse_error ("separator(#) missing in nrs_route '%s'", copy);		free (copy);		free ((char *) result);		return ((struct nrs_routes *) NULL);	}	*ptr_mid = '\0';	ptr_mid++;	/*	* route-cost is not optional - use encoding of NULL	* when this element is absent	*/	if ((ptr_prev == NULLCP) || ((*ptr_prev) == '\0'))	{		(*rt)->cost = pe_alloc (PE_CLASS_UNIV, PE_FORM_PRIM, PE_PRIM_NULL);	}	else if (((*rt)->cost = asnstr2pe (ptr_prev)) == NULLPE)	{		parse_error ("route-cost ASN malformed in nrs_route '%s'", copy);		free (copy);		free ((char *) result);		return ((struct nrs_routes *) NULL);	}	ptr_prev = SkipSpace (ptr_mid);	(*rt)->addr_info = str2addr_info (ptr_prev);	(*rt)->next = (struct nrs_routes *)NULL;	return (result);}static nrs_info_free (arg)struct nrs_info * arg;{	if (arg == (struct nrs_info *)NULL)		return;	if (arg->routes)		nrs_routes_free (arg->routes);	free ((char *) arg);}static struct nrs_info * nrs_info_cpy (arg)struct nrs_info * arg;{	struct nrs_info * result;	if (arg == (struct nrs_info *)NULL)                return ((struct nrs_info *)NULL);	result = (struct nrs_info *) smalloc (sizeof (struct nrs_info));	result->context = arg->context;	result->addr_sp_id = arg->addr_sp_id;	result->routes = nrs_routes_cpy (arg->routes);	return (result);}static nrs_info_cmp (arg1, arg2)struct nrs_info * arg1;struct nrs_info * arg2;{	if (arg1 == (struct nrs_info *) NULL)		if (arg2 == (struct nrs_info *) NULL)			return (0);		else 			return (-1);	if (arg2 == (struct nrs_info *) NULL)		return (1);	if (arg1->context < arg2->context)		return (-1);	if (arg1->context > arg2->context)		return (1);	if (arg1->addr_sp_id < arg2->addr_sp_id)		return (-1);	if (arg1->addr_sp_id > arg2->addr_sp_id)		return (1);	return (nrs_routes_cmp (arg1->routes, arg2->routes));}static context_print (ps, ctx, format)register PS	  ps;int		  ctx;int		  format;{	if (format != READOUT)	{		ps_printf (ps, "%d", ctx);		return;	}	switch(ctx)	{	case NRS_Context_X29:		ps_printf (ps, "x29");		break;	case NRS_Context_TS29:		ps_printf (ps, "ts29");		break;	case NRS_Context_NIFTP:		ps_printf (ps, "niftp");		break;	case NRS_Context_MAIL_NIFTP:		ps_printf (ps, "mail-niftp");		break;	case NRS_Context_MAIL_TELEX:		ps_printf (ps, "mail-telex");		break;	case NRS_Context_JTMP:		ps_printf (ps, "jtmp");		break;	case NRS_Context_JTMP_FILES:		ps_printf (ps, "jtmp-files");		break;	case NRS_Context_JTMP_REG:		ps_printf (ps, "jtmp-reg");		break;	case NRS_Context_YBTS_NODE:		ps_printf (ps, "ybts-node");		break;	case NRS_Context_YBTS:		ps_printf (ps, "ybts");		break;	case NRS_Context_FTAM:		ps_printf (ps, "ftam");		break;	case NRS_Context_JTM:		ps_printf (ps, "jtm");		break;	case NRS_Context_JTM_REG:		ps_printf (ps, "jtm-reg");		break;	case NRS_Context_VT:		ps_printf (ps, "vt");		break;	case NRS_Context_MOTIS:		ps_printf (ps, "motis");		break;	default:		ps_printf (ps, "%d", ctx);		break;	}}static addr_sp_id_print (ps, asi, format)register PS	  ps;int		  asi;int		  format;{	if (format != READOUT)	{		ps_printf (ps, "%d", asi);		return;	}	switch(asi)	{	case NRS_Address_Space_Id_PSS:		ps_printf (ps, "pss");		break;	case NRS_Address_Space_Id_JANET:		ps_printf (ps, "janet");		break;	case NRS_Address_Space_Id_TELEX:		ps_printf (ps, "telex");		break;	case NRS_Address_Space_Id_OSI_CONS:		ps_printf (ps, "osi-cons");		break;	default:		ps_printf (ps, "%d", asi);		break;	}}static nrs_info_print (ps, nrs, format)register PS	  ps;struct nrs_info	* nrs;int		  format;{	context_print (ps, nrs->context, format);	ps_printf (ps, "$");	addr_sp_id_print (ps, nrs->addr_sp_id, format);	ps_printf (ps, "$");	if (nrs->routes)		nrs_routes_print (ps, nrs->routes, format);}static str2context (orig)char	* orig;{	char	* str;	char	* cc;	int	  its_all_digits;	str = SkipSpace(orig);	its_all_digits = 1;	if ((str == NULLCP) || ((*str) == '\0'))	{		parse_error ("no context string", NULLCP);		return(-1);	}	/* Check for numeric-ness and strip trailing spaces */	for (cc=str; (*cc)!='\0'; cc++)	{		if (isspace(*cc))		{			(*cc) = '\0';			cc++;			break;		}		if (!isdigit(*cc))		{			its_all_digits = 0;		}	}	while (isspace(*cc))		cc++;	if ((*cc) != '\0')	{		parse_error ("malformed context string", NULLCP);		return(-1);	}	if (its_all_digits)	{		return(atoi(str));	}	else if (strcmp (str, "x29") == 0)	{		return (NRS_Context_X29);	}	else if (strcmp (str, "ts29") == 0)	{		return (NRS_Context_TS29);	}	else if (strcmp (str, "niftp") == 0)	{		return (NRS_Context_NIFTP);	}	else if (strcmp (str, "mail-niftp") == 0)	{		return (NRS_Context_MAIL_NIFTP);	}	else if (strcmp (str, "mail-telex") == 0)	{		return (NRS_Context_MAIL_TELEX);	}	else if (strcmp (str, "jtmp") == 0)	{		return (NRS_Context_JTMP);	}	else if (strcmp (str, "jtmp-files") == 0)	{		return (NRS_Context_JTMP_FILES);	}	else if (strcmp (str, "jtmp-reg") == 0)	{		return (NRS_Context_JTMP_REG);	}	else if (strcmp (str, "ybts-node") == 0)	{		return (NRS_Context_YBTS_NODE);	}	else if (strcmp (str, "ybts") == 0)	{		return (NRS_Context_YBTS);	}	else if (strcmp (str, "ftam") == 0)	{		return (NRS_Context_FTAM);	}	else if (strcmp (str, "jtm") == 0)	{		return (NRS_Context_JTM);	}	else if (strcmp (str, "jtm-reg") == 0)	{		return (NRS_Context_JTM_REG);	}	else if (strcmp (str, "vt") == 0)	{		return (NRS_Context_VT);	}	else if (strcmp (str, "motis") == 0)	{		return (NRS_Context_MOTIS);	}	else	{		parse_error ("unknown context string '%s'", str);		return (-1);	}}static str2addr_sp_id (orig)char	* orig;{	char	* str;	char	* cc;	int	  its_all_digits;	str = SkipSpace(orig);	its_all_digits = 1;	if ((str == NULLCP) || ((*str) == '\0'))	{		parse_error ("no address space string", NULLCP);		return(-1);	}	/* Check for numeric-ness and strip trailing spaces */	for (cc=str; (*cc)!='\0'; cc++)	{		if (isspace(*cc))		{			(*cc) = '\0';			cc++;			break;		}		if (!isdigit(*cc))		{			its_all_digits = 0;		}	}	while (isspace(*cc))		cc++;	if ((*cc) != '\0')	{		parse_error ("malformed address space string", NULLCP);		return(-1);	}	if (its_all_digits)	{		return(atoi(str));	}	else if (strcmp (str, "pss") == 0)	{		return(NRS_Address_Space_Id_PSS);	}	else if (strcmp (str, "janet") == 0)	{		return(NRS_Address_Space_Id_JANET);	}	else if (strcmp (str, "telex") == 0)	{		return(NRS_Address_Space_Id_TELEX);	}	else if (strcmp (str, "osi-cons") == 0)	{		return(NRS_Address_Space_Id_OSI_CONS);	}	else	{		parse_error ("unknown address space string '%s'", str);		return (-1);	}}static struct nrs_info	* str2nrs_info (orig)char * orig;{	struct nrs_info	* result;	char		* copy;	char		* ptr_prev;	char		* ptr_next;	result = (struct nrs_info *) smalloc (sizeof (struct nrs_info));	copy = strdup (orig);	ptr_prev = copy;	if ( (ptr_next=index (ptr_prev, '$')) == NULLCP)	{		parse_error ("first separator($) missing in nrs_info '%s'", orig);		free (copy);		free ((char *) result);		return ((struct nrs_info *) NULL);	}	*ptr_next = '\0';	ptr_next++;	if ((result->context = str2context (ptr_prev)) == -1)	{		parse_error ("malformed context '%s'", orig);		free (copy);		free ((char *) result);		return ((struct nrs_info *) NULL);	}	ptr_prev = ptr_next;	if ( (ptr_next=index (ptr_prev, '$')) == NULLCP)	{		parse_error ("second separator($) missing in nrs_info '%s'", orig);		free (copy);		free ((char *) result);		return ((struct nrs_info *) NULL);	}	*ptr_next = '\0';	ptr_next++;	if ((result->addr_sp_id = str2addr_sp_id (ptr_prev)) == -1)	{		parse_error ("malformed context '%s'", orig);		free (copy);		free ((char *) result);		return ((struct nrs_info *) NULL);	}	if (((ptr_prev = SkipSpace (ptr_next)) == NULLCP) || ((*ptr_prev) == '\0'))	{		result->routes = ((struct nrs_routes *)NULL);		return (result);	}	if ((result->routes = str2nrs_routes (ptr_prev)) == (struct nrs_routes *)NULL)	{		parse_error ("unparseable routes in nrs_info '%s'", orig);		free (copy);		free ((char *) result);		return ((struct nrs_info *) NULL);	}	return (result);}static PE nrs_info_enc (nrs)struct nrs_info * nrs;{PE ret_pe;        if (encode_NRS_NRSInformation (&ret_pe, 1, 0, NULLCP, nrs) != OK)		return (NULLPE);	return (ret_pe);}static struct nrs_info * nrs_info_dec (pe)PE pe;{	struct nrs_info	* nrs;	if (decode_NRS_NRSInformation (pe, 1, NULLIP, NULLVP, &nrs) != OK)	{		return ((struct nrs_info *) NULL);	}	return (nrs);}nrs_info_syntax (){	(void) add_attribute_syntax ("NRSInformation",		(IFP) nrs_info_enc,	(IFP) nrs_info_dec,		(IFP) str2nrs_info,	nrs_info_print,		(IFP) nrs_info_cpy,	nrs_info_cmp,		nrs_info_free,		NULLCP,		NULLIFP,		TRUE);}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?