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