atts.c
来自「ftam等标准协议服务器和客户端的源代码。」· C语言 代码 · 共 809 行 · 第 1/2 页
C
809 行
/* template.c - your comments here */#ifndef lintstatic char *rcsid = "$Header: /xtel/isode/isode/others/quipu/uips/de/RCS/atts.c,v 9.0 1992/06/16 12:45:59 isode Rel $";#endif/* * $Header: /xtel/isode/isode/others/quipu/uips/de/RCS/atts.c,v 9.0 1992/06/16 12:45:59 isode Rel $ * * * $Log: atts.c,v $ * Revision 9.0 1992/06/16 12:45:59 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 "quipu/util.h"#include "quipu/attrvalue.h"#include "quipu/syntaxes.h"#include "quipu/ds_search.h"#include "demanifest.h"#include "destrings.h"#include "namelist.h"#include "mapatts.h"#define PADCHARS 22extern char * TidyString();extern char * TidyString2();extern int soundex_match();extern int sfree();extern int dn_cmp();extern int dn_free();extern PE dn_enc();extern DN dn_dec();extern DN str2dnX();extern char * octparse ();extern char * prtparse ();extern char * mapPhone ();extern int ch_set;extern int telcmp();int greyBook = FALSE;char padding[20];static PS ps = NULLPS;char *val2str (av)AttributeValue av;{char *cp; if (ps == NULL && ((ps = ps_alloc (str_open)) == NULLPS) || str_setup (ps, NULLCP, BUFSIZ, 0) == NOTOK) { if (ps) ps_free (ps), ps = NULLPS; return NULLCP; } AttrV_print(ps, av, READOUT); ps_print (ps, " "); *--ps -> ps_ptr = NULL, ps -> ps_cnt++; cp = ps -> ps_base; ps -> ps_base = NULL, ps -> ps_cnt = 0; ps -> ps_ptr = NULL, ps -> ps_bufsiz = 0; return cp;}printDetails(objectType, lp)int objectType;struct namelist * lp;{Attr_Sequence at;AV_Sequence av;char * cp; if (lp->ats == NULLATTR) { switch (objectType) { case PERSON: (void) strcpy(padding, " "); break; case ORGUNIT: (void) strcpy(padding, " "); break; case ORG: (void) strcpy(padding, " "); break; case COUNTRY: (void) strcpy(padding, " "); break; } pageprint("%s(Sorry - no details available)\n", padding); return; } linewrapOn(); for (at = lp->ats; at != NULLATTR; at = at->attr_link) { switch (objectType) { case PERSON: (void) strcpy(padding, " "); break; case ORGUNIT: (void) strcpy(padding, " "); break; case ORG: (void) strcpy(padding, " "); break; case COUNTRY: (void) strcpy(padding, " "); break; } pageprint("%s%-*s", padding, PADCHARS, mapAttName(attr2name(at->attr_type, OIDPART))); for (av = at->attr_value; av != NULLAV; av = av->avseq_next) { if (av != at->attr_value) pageprint("%s%*s", padding, PADCHARS, ""); cp = val2str(&(av->avseq_av)); pageprint("%s\n", cp); free(cp); } } linewrapOff();}printPersonOneLiner(lp, number)struct namelist * lp;int number;{Attr_Sequence at;char * cp;char mail[LINESIZE], phone[LINESIZE]; mail[0] = phone[0] = '\0'; pageprint(" %3d ", number); cp = lastComponent(lp->name, PERSON); pageprint(" %-19s ", cp); free(cp); for (at = lp->ats; at != NULLATTR; at = at->attr_link) { if (strcmp(attr2name(at->attr_type, OIDPART), DE_MAILBOX) == 0) { cp = val2str(&(at->attr_value->avseq_av)); (void) strcpy(mail, cp); free(cp); continue; } if (strcmp(attr2name(at->attr_type, OIDPART), DE_TELEPHONE) == 0) { cp = val2str(&(at->attr_value->avseq_av)); (void) strcpy(phone, cp); free(cp); continue; } } pageprint("%-20s %s\n", phone, mail);}/* special functions for handling attributes with PostalAddress syntax *//* actually we only want a special handler for the printing, but static declarations in dsap/common/post.c force us to do all this */static de_addrfree (addr)struct postaddr * addr;{ struct postaddr * next; for (; addr != (struct postaddr *) NULL; addr = next) { next = addr->pa_next; free (addr->addrcomp); free ( (char *)addr); }}static de_addrcmp (a,b)struct postaddr * a, *b;{int res; for (; (a != (struct postaddr *) NULL) && (b != (struct postaddr *) NULL) ; a = a->pa_next, b=b->pa_next) if ((res = lexequ (a->addrcomp, b->addrcomp)) != 0) return (res); if ( a != b) return ( a > b ? 1 : -1 ); else return (0); }static struct postaddr * de_addrcpy (a)struct postaddr * a;{struct postaddr * b, *c, *result = (struct postaddr *) NULL; c = result; /* to keep lint quiet ! */ for (; a != (struct postaddr *) NULL; a = a->pa_next) { b = (struct postaddr *) smalloc (sizeof (struct postaddr)); b -> addrtype = a->addrtype; b -> addrcomp = strdup (a->addrcomp); if (result == (struct postaddr *) NULL) result = b; else c->pa_next = b; c = b; } b->pa_next = (struct postaddr *) NULL; return (result);}static struct postaddr* de_addrparse (str)char * str;{struct postaddr * result = (struct postaddr *) NULL;struct postaddr * a, *b;char * ptr;char * mark = NULLCP;char t61_str = FALSE;extern char t61_flag;int i; b = result; /* to keep lint quiet */ if (t61_flag) { t61_str = TRUE; t61_flag = FALSE; /* indicate recognition */ } str = SkipSpace(str); for (i=0; i < UB_POSTAL_LINE; i++) { mark = NULLCP; a = (struct postaddr *) smalloc (sizeof (struct postaddr)); if ( (ptr=index (str,'$')) != NULLCP) { *ptr-- = 0; if (isspace (*ptr)) { *ptr = 0; mark = ptr; } ptr++; } if (t61_str) { a -> addrtype = 1; if ((a -> addrcomp = octparse (str)) == NULLCP) return ((struct postaddr *)NULL); if ((int)strlen (a->addrcomp) > UB_POSTAL_STRING) { parse_error ("address string too long",NULLCP); return ((struct postaddr *)NULL); } } else { a -> addrtype = 2; if ((a -> addrcomp = prtparse (str)) == NULLCP) return ((struct postaddr *)NULL); if ((int)strlen (a->addrcomp) > UB_POSTAL_STRING) { parse_error ("address string too long",NULLCP); return ((struct postaddr *)NULL); } } if (result == (struct postaddr *) NULL) result = a; else b->pa_next = a; b = a; t61_str = FALSE; if (ptr != NULLCP) { *ptr++ = '$'; if (mark != NULLCP) *mark = ' '; str = (SkipSpace(ptr)); ptr = str; if (*ptr++ == '{') { if (( str = index (ptr,'}')) == 0) { parse_error ("close bracket missing '%s'",--ptr); return ((struct postaddr *) NULL); } *str = 0; if (lexequ ("T.61",ptr) != 0) { *str = '}'; parse_error ("{T.61} expected '%s'",--ptr); return ((struct postaddr *) NULL); } *str++ = '}'; str = (SkipSpace(str)); t61_str = TRUE; } } else break; } if (ptr != NULLCP) { parse_error ("Too many address components",NULLCP); return ((struct postaddr *) NULL); } a -> pa_next = (struct postaddr *) NULL ; return (result);}static PE de_addrenc (m)struct postaddr * m;{PE ret_pe; (void) encode_SA_PostalAddress (&ret_pe,0,0,NULLCP,m); return (ret_pe);}static struct postaddr * de_addrdec (pe)PE pe;{struct postaddr * m; if (decode_SA_PostalAddress (pe,1,NULLIP,NULLVP,&m) == NOTOK) return ((struct postaddr *) NULL); return (m);}extern int postal_indent;static de_addrprint (xps,addr,format)PS xps;struct postaddr * addr;int format;{char * prefix = NULLCP;char prefbuff[100]; for (; addr != (struct postaddr *) NULL; addr = addr->pa_next) { if (prefix != NULLCP) if (format != READOUT || postal_indent < 0) ps_print (xps,prefix); else { ps_print (xps, "\n"); if (postal_indent > 0) ps_printf (xps, "%*s", postal_indent, ""); } if (addr->addrtype == 1) { if (format != READOUT) ps_print (xps,"{T.61}"); octprint (xps,addr->addrcomp,format); } else ps_print (xps,addr->addrcomp); if (format == READOUT) { if (postal_indent == 0) postal_indent = 2; (void) sprintf(prefbuff, "\n%s%*s", padding, PADCHARS, ""); prefix = prefbuff; } }}/* special functions for handling email addresses */static PE de_ia5enc (x)char *x;{ return (ia5s2prim(x,strlen(x)));}static char * de_ia5sdec (pe)PE pe;{int z; if (test_prim_pe (pe,PE_CLASS_UNIV,PE_DEFN_IA5S))
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?