nrs_info.c

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

C
1,732
字号
			pe_print (ps, info->place_holder, format);		ps_printf (ps, "#");		if (info->application_title)			pe_print (ps, info->application_title, format);		ps_printf (ps, "#");		if (info->per_app_context_info)			pe_print (ps, info->per_app_context_info, format);		break;	case ADDR_INFO_OSI_NSAP_ONLY:		ps_printf (ps, "%s", "osi_nsap_only");		ps_printf (ps, ":");		ps_printf (ps, "%s", info->nsap);		break;	case ADDR_INFO_OSI_NSAP_APPLIC_INFO:		ps_printf (ps, "%s", "osi_nsap_applic_info");		ps_printf (ps, ":");		ps_printf (ps, "%s", info->nsap);		ps_printf (ps, "#");		str_seq_print (ps, info->applic_info, format);		break;	case ADDR_INFO_OSI_NSAP_APPLIC_RELAY:		ps_printf (ps, "%s", "osi_nsap_applic_relay");		ps_printf (ps, ":");		ps_printf (ps, "%s", info->nsap);		ps_printf (ps, "#");		str_seq_print (ps, info->applic_relay, format);		break;	case ADDR_INFO_DTE_YBTS_OSI_ADDRESSING:		ps_printf (ps, "%s", "dte_ybts_osi_addressing");		ps_printf (ps, ":");		ps_printf (ps, "%s", info->dte_number);		ps_printf (ps, "#");		ps_printf (ps, "%s", info->ybts_string);		ps_printf (ps, "#");		if (info->tselector)			ps_printf (ps, "%s", info->tselector);		ps_printf (ps, "#");		if (info->sselector)			ps_printf (ps, "%s", info->sselector);		ps_printf (ps, "#");		if (info->pselector)			ps_printf (ps, "%s", info->pselector);		ps_printf (ps, "#");		if (info->place_holder)			pe_print (ps, info->place_holder, format);		ps_printf (ps, "#");		if (info->application_title)			pe_print (ps, info->application_title, format);		ps_printf (ps, "#");		if (info->per_app_context_info)			pe_print (ps, info->per_app_context_info, format);		break;	default:		ps_printf (ps, "%s", "addr_info print error");		LLOG (log_dsap, LLOG_EXCEPTIONS, ("addr_info_print(): Unknown addressing info type %d", info->addr_info_type));		break;	}}static struct addr_info	* str2addr_info (orig)char * orig;{	struct addr_info	* result;	char			* copy;	char			* ptr_prev;	char			* ptr_next;	char			* eraser;	result = (struct addr_info *) calloc (1, sizeof (struct addr_info));	copy = strdup (orig);	ptr_prev = SkipSpace (copy);	if ( (ptr_next=index (ptr_prev, ':')) == NULLCP)	{		parse_error ("first separator(:) missing in addr_info '%s'", orig);		free (copy);		free ((char *) result);		return ((struct addr_info *) NULL);	}	*ptr_next = '\0';	/* Eliminate trailing spaces so that strcmp succeeds */	eraser = ptr_next;	for (eraser--; (*eraser) == ' '; eraser--)	{		(*eraser) = '\0';	}	ptr_next++;	if (strcmp (ptr_prev, "dte_only") == 0)	{		result->addr_info_type = ADDR_INFO_DTE_ONLY;		ptr_prev = SkipSpace (ptr_next);		result->dte_number = strdup (ptr_prev);	}	else if (strcmp (ptr_prev, "dte_applic_info") == 0)	{		result->addr_info_type = ADDR_INFO_DTE_APPLIC_INFO;		ptr_prev = SkipSpace (ptr_next);		if ( (ptr_next=index (ptr_prev, '#')) == NULLCP)		{			parse_error ("second separator(#) missing in addr_info '%s'", orig);			free (copy);			free ((char *) result);			return ((struct addr_info *) NULL);		}		*ptr_next = '\0';		ptr_next++;		result->dte_number = strdup (ptr_prev);		ptr_prev = SkipSpace (ptr_next);		result->applic_info = str2str_seq (ptr_prev);	}	else if (strcmp (ptr_prev, "dte_cudf") == 0)	{		result->addr_info_type = ADDR_INFO_DTE_CUDF;		ptr_prev = SkipSpace (ptr_next);		if ( (ptr_next=index (ptr_prev, '#')) == NULLCP)		{			parse_error ("second separator(#) missing in addr_info '%s'", orig);			free (copy);			free ((char *) result);			return ((struct addr_info *) NULL);		}		*ptr_next = '\0';		ptr_next++;		result->dte_number = strdup (ptr_prev);		ptr_prev = SkipSpace (ptr_next);		result->cudf = strdup (ptr_prev);	}	else if (strcmp (ptr_prev, "dte_cudf_applic_info") == 0)	{		result->addr_info_type = ADDR_INFO_DTE_CUDF_APPLIC_INFO;		ptr_prev = SkipSpace (ptr_next);		if ( (ptr_next=index (ptr_prev, '#')) == NULLCP)		{			parse_error ("second separator(#) missing in addr_info '%s'", orig);			free (copy);			free ((char *) result);			return ((struct addr_info *) NULL);		}		*ptr_next = '\0';		ptr_next++;		result->dte_number = strdup (ptr_prev);		ptr_prev = SkipSpace (ptr_next);		if ( (ptr_next=index (ptr_prev, '#')) == NULLCP)		{			parse_error ("third separator(#) missing in addr_info '%s'", orig);			free (copy);			free ((char *) result);			return ((struct addr_info *) NULL);		}		*ptr_next = '\0';		ptr_next++;		result->cudf = strdup (ptr_prev);		ptr_prev = SkipSpace (ptr_next);		result->applic_info = str2str_seq (ptr_prev);	}	else if (strcmp (ptr_prev, "dte_ybts") == 0)	{		result->addr_info_type = ADDR_INFO_DTE_YBTS;		ptr_prev = SkipSpace (ptr_next);		if ( (ptr_next=index (ptr_prev, '#')) == NULLCP)		{			parse_error ("second separator(#) missing in addr_info '%s'", orig);			free (copy);			free ((char *) result);			return ((struct addr_info *) NULL);		}		*ptr_next = '\0';		ptr_next++;		result->dte_number = strdup (ptr_prev);		ptr_prev = SkipSpace (ptr_next);		result->ybts_string = strdup (ptr_prev);	}	else if (strcmp (ptr_prev, "dte_ybts_applic_info") == 0)	{		result->addr_info_type = ADDR_INFO_DTE_YBTS_APPLIC_INFO;		ptr_prev = SkipSpace (ptr_next);		if ( (ptr_next=index (ptr_prev, '#')) == NULLCP)		{			parse_error ("second separator(#) missing in addr_info '%s'", orig);			free (copy);			free ((char *) result);			return ((struct addr_info *) NULL);		}		*ptr_next = '\0';		ptr_next++;		result->dte_number = strdup (ptr_prev);		ptr_prev = SkipSpace (ptr_next);		if ( (ptr_next=index (ptr_prev, '#')) == NULLCP)		{			parse_error ("third separator(#) missing in addr_info '%s'", orig);			free (copy);			free ((char *) result);			return ((struct addr_info *) NULL);		}		*ptr_next = '\0';		ptr_next++;		result->ybts_string = strdup (ptr_prev);		ptr_prev = SkipSpace (ptr_next);		result->applic_info = str2str_seq (ptr_prev);	}	else if (strcmp (ptr_prev, "dte_ybts_applic_relay") == 0)	{		result->addr_info_type = ADDR_INFO_DTE_YBTS_APPLIC_RELAY;		ptr_prev = SkipSpace (ptr_next);		if ( (ptr_next=index (ptr_prev, '#')) == NULLCP)		{			parse_error ("second separator(#) missing in addr_info '%s'", orig);			free (copy);			free ((char *) result);			return ((struct addr_info *) NULL);		}		*ptr_next = '\0';		ptr_next++;		result->dte_number = strdup (ptr_prev);		ptr_prev = SkipSpace (ptr_next);		if ( (ptr_next=index (ptr_prev, '#')) == NULLCP)		{			parse_error ("third separator(#) missing in addr_info '%s'", orig);			free (copy);			free ((char *) result);			return ((struct addr_info *) NULL);		}		*ptr_next = '\0';		ptr_next++;		result->ybts_string = strdup (ptr_prev);		ptr_prev = SkipSpace (ptr_next);		result->applic_relay = str2str_seq (ptr_prev);	}	else if (strcmp (ptr_prev, "none_needed") == 0)	{		result->addr_info_type = ADDR_INFO_NONE_NEEDED;	}	else if (strcmp (ptr_prev, "osi_addressing") == 0)	{		result->addr_info_type = ADDR_INFO_OSI_ADDRESSING;		ptr_prev = SkipSpace (ptr_next);		if ( (ptr_next=index (ptr_prev, '#')) == NULLCP)		{			parse_error ("second separator(#) missing in addr_info '%s'", orig);			free (copy);			free ((char *) result);			return ((struct addr_info *) NULL);		}		*ptr_next = '\0';		ptr_next++;		result->nsap = strdup (ptr_prev);		ptr_prev = ptr_next;		if ( (ptr_next=index (ptr_prev, '#')) == NULLCP)		{			parse_error ("third separator(#) missing in addr_info '%s'", orig);			free (copy);			free ((char *) result);			return ((struct addr_info *) NULL);		}		*ptr_next = '\0';		ptr_next++;		result->tselector = strdup (ptr_prev);		ptr_prev = ptr_next;		if ( (ptr_next=index (ptr_prev, '#')) == NULLCP)		{			parse_error ("fourth separator(#) missing in addr_info '%s'", orig);			free (copy);			free ((char *) result);			return ((struct addr_info *) NULL);		}		*ptr_next = '\0';		ptr_next++;		result->sselector = strdup (ptr_prev);		ptr_prev = ptr_next;		if ( (ptr_next=index (ptr_prev, '#')) == NULLCP)		{			parse_error ("fifth separator(#) missing in addr_info '%s'", orig);			free (copy);			free ((char *) result);			return ((struct addr_info *) NULL);		}		*ptr_next = '\0';		ptr_next++;		result->pselector = strdup (ptr_prev);		ptr_prev = ptr_next;		if ( (ptr_next=index (ptr_prev, '#')) == NULLCP)		{			parse_error ("sixth separator(#) missing in addr_info '%s'", orig);			free (copy);			free ((char *) result);			return ((struct addr_info *) NULL);		}		*ptr_next = '\0';		ptr_next++;		result->place_holder = asnstr2pe (ptr_prev);		ptr_prev = ptr_next;		if ( (ptr_next=index (ptr_prev, '#')) == NULLCP)		{			parse_error ("seventh separator(#) missing in addr_info '%s'", orig);			free (copy);			free ((char *) result);			return ((struct addr_info *) NULL);		}		*ptr_next = '\0';		ptr_next++;		result->application_title = asnstr2pe (ptr_prev);		ptr_prev = ptr_next;		result->per_app_context_info = asnstr2pe (ptr_prev);	}	else if (strcmp (ptr_prev, "osi_nsap_only") == 0)	{		result->addr_info_type = ADDR_INFO_OSI_NSAP_ONLY;		ptr_prev = SkipSpace (ptr_next);		result->nsap = strdup (ptr_prev);	}	else if (strcmp (ptr_prev, "osi_nsap_applic_info") == 0)	{		result->addr_info_type = ADDR_INFO_OSI_NSAP_APPLIC_INFO;		ptr_prev = SkipSpace (ptr_next);		if ( (ptr_next=index (ptr_prev, '#')) == NULLCP)		{			parse_error ("second separator(#) missing in addr_info '%s'", orig);			free (copy);			free ((char *) result);			return ((struct addr_info *) NULL);		}		*ptr_next = '\0';		ptr_next++;		result->nsap = strdup (ptr_prev);		ptr_prev = SkipSpace (ptr_next);		result->applic_info = str2str_seq (ptr_prev);	}	else if (strcmp (ptr_prev, "osi_nsap_applic_relay") == 0)	{		result->addr_info_type = ADDR_INFO_OSI_NSAP_APPLIC_RELAY;		ptr_prev = SkipSpace (ptr_next);		if ( (ptr_next=index (ptr_prev, '#')) == NULLCP)		{			parse_error ("second separator(#) missing in addr_info '%s'", orig);			free (copy);			free ((char *) result);			return ((struct addr_info *) NULL);		}		*ptr_next = '\0';		ptr_next++;		result->nsap = strdup (ptr_prev);		ptr_prev = SkipSpace (ptr_next);		result->applic_relay = str2str_seq (ptr_prev);	}	else if (strcmp (ptr_prev, "dte_ybts_osi_addressing") == 0)	{		result->addr_info_type = ADDR_INFO_DTE_YBTS_OSI_ADDRESSING;		ptr_prev = SkipSpace (ptr_next);		if ( (ptr_next=index (ptr_prev, '#')) == NULLCP)		{			parse_error ("second separator(#) missing in addr_info '%s'", orig);			free (copy);			free ((char *) result);			return ((struct addr_info *) NULL);		}		*ptr_next = '\0';		ptr_next++;		result->dte_number = strdup (ptr_prev);		ptr_prev = ptr_next;		if ( (ptr_next=index (ptr_prev, '#')) == NULLCP)		{			parse_error ("third separator(#) missing in addr_info '%s'", orig);			free (copy);			free ((char *) result);			return ((struct addr_info *) NULL);		}		*ptr_next = '\0';		ptr_next++;		result->ybts_string = strdup (ptr_prev);		ptr_prev = ptr_next;		if ( (ptr_next=index (ptr_prev, '#')) == NULLCP)		{			parse_error ("fourth separator(#) missing in addr_info '%s'", orig);			free (copy);			free ((char *) result);			return ((struct addr_info *) NULL);		}		*ptr_next = '\0';		ptr_next++;		result->tselector = strdup (ptr_prev);		ptr_prev = ptr_next;		if ( (ptr_next=index (ptr_prev, '#')) == NULLCP)		{			parse_error ("fifth separator(#) missing in addr_info '%s'", orig);			free (copy);			free ((char *) result);			return ((struct addr_info *) NULL);		}		*ptr_next = '\0';		ptr_next++;		result->sselector = strdup (ptr_prev);		ptr_prev = ptr_next;		if ( (ptr_next=index (ptr_prev, '#')) == NULLCP)		{			parse_error ("sixth separator(#) missing in addr_info '%s'", orig);			free (copy);			free ((char *) result);			return ((struct addr_info *) NULL);		}		*ptr_next = '\0';		ptr_next++;		result->pselector = strdup (ptr_prev);		ptr_prev = ptr_next;		if ( (ptr_next=index (ptr_prev, '#')) == NULLCP)		{			parse_error ("seventh separator(#) missing in addr_info '%s'", orig);			free (copy);			free ((char *) result);			return ((struct addr_info *) NULL);		}		*ptr_next = '\0';		ptr_next++;		result->place_holder = asnstr2pe (ptr_prev);		ptr_prev = ptr_next;		if ( (ptr_next=index (ptr_prev, '#')) == NULLCP)		{			parse_error ("eighth separator(#) missing in addr_info '%s'", orig);			free (copy);			free ((char *) result);			return ((struct addr_info *) NULL);		}		*ptr_next = '\0';		ptr_next++;		result->application_title = asnstr2pe (ptr_prev);		ptr_prev = ptr_next;		result->per_app_context_info = asnstr2pe (ptr_prev);	}	else	{		parse_error ("unknown addr_info type: '%s'", ptr_prev);		free (copy);		free ((char *) result);		return ((struct addr_info *) NULL);	}	return (result);}static nrs_routes_free (arg)struct nrs_routes * arg;{	if (arg == (struct nrs_routes *)NULL)		return;	if (arg->cost)		pe_free (arg->cost);	if (arg->addr_info)		addr_info_free (arg->addr_info);	if (arg->next)		nrs_routes_free (arg->next);	free ((char *) arg);}static struct nrs_routes * nrs_routes_cpy (arg)struct nrs_routes * arg;{	struct nrs_routes * ret;	if (arg == (struct nrs_routes *)NULL)		return ((struct nrs_routes *)NULL);	ret = (struct nrs_routes *) smalloc (sizeof (struct nrs_routes));	if (arg->cost == NULLPE)		ret->cost = NULLPE;	else		ret->cost = pe_cpy (arg->cost);	ret->addr_info = addr_info_cpy (arg->addr_info);	ret->next = nrs_routes_cpy (arg->next);	return (ret);}static nrs_routes_cmp (arg1, arg2)struct nrs_routes * arg1;struct nrs_routes * arg2;{	int	  ret;	if (arg1 == (struct nrs_routes *)NULL)		if (arg2 == (struct nrs_routes *)NULL)			return (0);		else			return (-1);	if (arg2 == (struct nrs_routes *)NULL)		return (1);	if ((ret = pe_cmp (arg1->cost, arg2->cost)) != 0)		return (ret);	if ((ret = addr_info_cmp (arg1->addr_info, arg2->addr_info)) != 0)		return (ret);	return (nrs_routes_cmp (arg1->next, arg2->next));}static nrs_routes_print (ps, routes, format)register PS		  ps;struct nrs_routes	* routes;

⌨️ 快捷键说明

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