|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T s
Length: 9958 (0x26e6) Types: TextFile Names: »string.c«
└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0 └─⟦35176feda⟧ »EurOpenD22/isode/isode-6.tar.Z« └─⟦de7628f85⟧ └─⟦this⟧ »isode-6.0/dsap/common/string.c«
/* string.c - printable string handling */ #ifndef lint static char *rcsid = "$Header: /f/osi/dsap/common/RCS/string.c,v 7.1 89/12/19 16:19:33 mrose Exp $"; #endif /* * $Header: /f/osi/dsap/common/RCS/string.c,v 7.1 89/12/19 16:19:33 mrose Exp $ * * * $Log: string.c,v $ * Revision 7.1 89/12/19 16:19:33 mrose * sync * * Revision 7.0 89/11/23 21:44:33 mrose * Release 6.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. * */ /* LINTLIBRARY */ #include "quipu/util.h" #include "quipu/ds_search.h" extern LLog * log_dsap; #ifdef REMOVE_FOR_6_0 int relaxed = TRUE; #endif #define T61_MARK '$' static short exct = 0; static char char_failed; soundex_match (); static PE ia5enc (x) char *x; { return (ia5s2prim(x,strlen(x))); } static PE nstrenc (x) char *x; { return (nums2prim(x,strlen(x))); } static PE octenc (x) char *x; { return (oct2prim(x,strlen(x))); } static PE strenc (x) char *x; { if (*x == T61_MARK) { x++; return (t61s2prim(x,strlen(x))); } else return (prts2prim(x,strlen(x))); } static char * local_t61 (a) char * a; { char * b; if (a == NULLCP) return (NULLCP); b = smalloc (strlen(a) +2); *b++ = T61_MARK; (void) strcpy (b,a); (void) free (a); return (--b); } static char * prtsdec (pe) PE pe; { int z; #ifdef REMOVE_FOR_6_0 if (relaxed) return (prim2str(pe,&z)); #endif if (test_prim_pe (pe,PE_CLASS_UNIV,PE_DEFN_PRTS)) return (prim2str(pe,&z)); else return (NULLCP); } static char * cntydec (pe) PE pe; { char *a; if ((a = prtsdec(pe)) == NULLCP) return (NULLCP); if (strlen (a) != 2) { LLOG (log_dsap,LLOG_EXCEPTIONS, ("Country code size wrong")); return (NULLCP); } return (a); } static char * octsdec (pe) PE pe; { int z; #ifdef REMOVE_FOR_6_0 if (relaxed) return (prim2str(pe,&z)); #endif if (test_prim_pe (pe,PE_CLASS_UNIV,PE_PRIM_OCTS)) return (prim2str(pe,&z)); else return (NULLCP); } static char * ia5sdec (pe) PE pe; { int z; #ifdef REMOVE_FOR_6_0 if (relaxed) return (prim2str(pe,&z)); #endif if (test_prim_pe (pe,PE_CLASS_UNIV,PE_DEFN_IA5S)) return (prim2str(pe,&z)); else return (NULLCP); } static char * numsdec (pe) PE pe; { int z; if (test_prim_pe (pe,PE_CLASS_UNIV,PE_DEFN_NUMS)) return (prim2str(pe,&z)); else return (NULLCP); } static char * t61dec (pe) PE pe; { int z; #ifdef REMOVE_FOR_6_0 if (relaxed) return (prim2str(pe,&z)); #endif if (pe->pe_form != PE_FORM_PRIM) { LLOG (log_dsap,LLOG_EXCEPTIONS,("Primative string expected")); return NULLCP; } if ( PE_ID (pe -> pe_class, pe -> pe_id) == PE_ID (PE_CLASS_UNIV,PE_DEFN_T61S) ) return (local_t61 (prim2str(pe,&z))); else return (prtsdec(pe)); } static char * quotechar (a,b) char a, *b; { (void) sprintf (b,"\\%02x", a & 0xff); b += 3; return (b); } static char * unquotechar (a,b) char *a, *b; { int val; if (*a == '\\') *b = '\\'; else { (void) sscanf (a,"%2x", &val); *b = val & 0xff; a++; } return (a); } static check_print_string (str) char * str; { for (; *str != 0; str++) { if (isalnum (*str)) continue; switch (*str) { case 047: /* ' */ case '(': case ')': case '+': case '-': case '.': case ',': case '/': case ':': case '=': case '?': case ' ': continue; default: LLOG (log_dsap,LLOG_NOTICE,("character '%c' not in printablestring",*str)); return (0); } } return (1); } char * octparse (str) char * str; { char buffer [BUFSIZ]; register char * ptr=buffer; for (; *str != 0; str++) if (*str != '\\') *ptr++ = *str; else { str++; str = unquotechar (str,ptr); ptr++; } *ptr = 0; return (strdup(buffer)); } static char * prtparse_aux (str) char * str; { #ifdef REMOVE_FOR_6_0 if (relaxed) return (strdup (str)); #endif if (check_print_string (str)) return (strdup (str)); else return (NULLCP); } char * prtparse (str) char * str; { char * ptr; if ((ptr = prtparse_aux(str)) != NULLCP) return (ptr); else { parse_error ("character '%c' not in printablestring",(char *)char_failed); return (NULLCP); } } static char * cntyparse(str) char * str; { char * a; if ((a=prtparse(str)) == NULLCP) return (NULLCP); if (strlen (a) != 2) { parse_error ("country code size wrong",NULLCP); return (NULLCP); } return (a); } static char * t61parse (str) char * str; { extern char t61_flag; char * octparse (); char * res; if (t61_flag) { t61_flag = FALSE; /* recognised it !!! */ return (local_t61(octparse (str))); /* need t61 parser */ } else if ((res=prtparse_aux(str)) == NULLCP) { LLOG (log_dsap,LLOG_NOTICE,("auto-convert to T.61 for '%s' ('%c' not allowed)",str,char_failed)); return (local_t61(octparse (str))); } else return (res); } char * cryptstring (str) char * str; { register char * p; /* This is a SIMPLE HACK to prevent passwords being revealed */ /* at a glance. It buys virtually no extra security */ #define CRYPT_MASK 0x23 /* could tailor this */ for (p=str; *p != 0; p++) if (*p != CRYPT_MASK) *p ^= CRYPT_MASK; return (str); } char * cryptparse (str) char * str; { extern char crypt_flag; char * octparse (); if (crypt_flag) { crypt_flag = FALSE; /* recognised it !!! */ return (cryptstring(octparse (str))); } else return (octparse (str)); } sfree (x) char *x; { free (x); } pstrcmp (a,b) char * a, *b; { int c; if ((c= strcmp (a,b)) == 0) return (0); if ( c > 0) return (1); else return (-1); } passwdcmp (a,b) char * a, *b; { if (strcmp (a,b) == 0) return (0); else return (2); } telcmp (a, b) char *a, *b; { register char c1, c2; if (a == NULL) return (b ? -1 : 0); else if (b == NULL) return 1; for (;;) { while (c1 = *a++) if (c1 != ' ' && c1 != '-') break; while (c2 = *b++) if (c2 != ' ' && c2 != '-') break; if (c1 == NULL) return (c2 ? -1 : 0); else if (c2 == NULL) return 1; if (c1 > c2) return 1; else if (c1 < c2) return -1; } } strprint (ps,str,format) PS ps; char * str; int format; { if (*str == T61_MARK) { if (format != READOUT) ps_print (ps,"{T.61} "); octprint (ps,++str,format); } else ps_print (ps,str); } cryptprint (ps,str,format) PS ps; char * str; int format; { char * ptr; extern char allow_crypt; if (format == READOUT) ps_print (ps,"HIDDEN"); else { if (! allow_crypt) { octprint (ps,str,format); return; } ps_print (ps,"{CRYPT}"); ptr = strdup (str); octprint (ps,cryptstring(ptr),format); free ((char *)ptr); } } /* ARGSUSED */ octprint (ps,str,format) PS ps; char * str; int format; { char buffer [BUFSIZ]; register char * ptr=buffer; for (; *str != 0; str++) { if (isprint(*str)) { if (format != READOUT) switch (*str) { case '&': /* used as seperators */ case '#': case '$': case '%': case '@': ptr = quotechar (*str,ptr); break; default: *ptr++ = *str; if (*str == '\\') *ptr++ = *str; } else *ptr++ = *str; } else ptr = quotechar (*str,ptr); } *ptr = 0; ps_print (ps,buffer); } case_exact_match (sntx) short sntx; { if ((sntx < exct) || (sntx > (exct + 2))) return (FALSE); else return (TRUE); } approx_string (sntx) short sntx; { if ((sntx < exct) || (sntx > (exct + 7))) return (FALSE); else return (TRUE); } sub_string (sntx) short sntx; { if ((sntx < exct) || (sntx > (exct + 9))) return (FALSE); else return (TRUE); } string_syntaxes () { /* Don't change ordering here unless you know the side effects !!! */ /* 1-3 Exact string */ /* 1-7 Approx */ exct = add_attribute_syntax ("caseexactstring", (IFP) strenc, (IFP) t61dec, (IFP) t61parse, strprint, (IFP) strdup, pstrcmp, sfree, NULLCP, soundex_match, TRUE); (void) add_attribute_syntax ("TelephoneNumber", (IFP) strenc, (IFP) prtsdec, (IFP) prtparse, strprint, (IFP) strdup, telcmp, sfree, NULLCP, soundex_match, TRUE); (void) add_attribute_syntax ("printablestring", (IFP) strenc, (IFP) prtsdec, (IFP) prtparse, strprint, (IFP) strdup, pstrcmp, sfree, NULLCP, soundex_match, TRUE); (void) add_attribute_syntax ("ia5string", (IFP) ia5enc, (IFP) ia5sdec, (IFP) octparse, octprint, (IFP) strdup, pstrcmp, sfree, NULLCP, soundex_match, TRUE); /* 5-8 ignore strings */ (void) add_attribute_syntax ("countrystring", (IFP) strenc, (IFP) cntydec, (IFP) cntyparse,strprint, (IFP) strdup, lexequ, sfree, NULLCP, soundex_match, TRUE); (void) add_attribute_syntax ("DestinationString", (IFP) strenc, (IFP) prtsdec, (IFP) prtparse, strprint, (IFP) strdup, lexequ, sfree, NULLCP, soundex_match, TRUE); (void) add_attribute_syntax ("caseignorestring", (IFP) strenc, (IFP) t61dec, (IFP) t61parse, strprint, (IFP) strdup, lexequ, sfree, NULLCP, soundex_match, TRUE); (void) add_attribute_syntax ("caseIgnoreIa5string", (IFP) ia5enc, (IFP) ia5sdec, (IFP) octparse, octprint, (IFP) strdup, lexequ, sfree, NULLCP, soundex_match, TRUE); /* 1-10 -> substrings */ (void) add_attribute_syntax ("numericstring", (IFP) nstrenc, (IFP) numsdec, (IFP) strdup, strprint, (IFP) strdup, pstrcmp, sfree, NULLCP, NULLIFP, FALSE); (void) add_attribute_syntax ("octetstring", (IFP) octenc, (IFP) octsdec, (IFP) octparse, octprint, (IFP) strdup, pstrcmp, sfree, NULLCP, NULLIFP, TRUE); (void) add_attribute_syntax ("password", (IFP) octenc, (IFP) octsdec, (IFP) cryptparse, cryptprint, (IFP) strdup, passwdcmp, sfree, NULLCP, NULLIFP, TRUE); }