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