|
|
1.1 ! root 1: /* string.c - printable string handling */ ! 2: ! 3: #ifndef lint ! 4: static char *rcsid = "$Header: /f/osi/dsap/common/RCS/string.c,v 7.3 90/07/09 14:35:09 mrose Exp $"; ! 5: #endif ! 6: ! 7: /* ! 8: * $Header: /f/osi/dsap/common/RCS/string.c,v 7.3 90/07/09 14:35:09 mrose Exp $ ! 9: * ! 10: * ! 11: * $Log: string.c,v $ ! 12: * Revision 7.3 90/07/09 14:35:09 mrose ! 13: * sync ! 14: * ! 15: * Revision 7.2 90/04/18 08:50:09 mrose ! 16: * 6.2 ! 17: * ! 18: * Revision 7.1 89/12/19 16:19:33 mrose ! 19: * sync ! 20: * ! 21: * Revision 7.0 89/11/23 21:44:33 mrose ! 22: * Release 6.0 ! 23: * ! 24: */ ! 25: ! 26: /* ! 27: * NOTICE ! 28: * ! 29: * Acquisition, use, and distribution of this module and related ! 30: * materials are subject to the restrictions of a license agreement. ! 31: * Consult the Preface in the User's Manual for the full terms of ! 32: * this agreement. ! 33: * ! 34: */ ! 35: ! 36: ! 37: /* LINTLIBRARY */ ! 38: ! 39: #include "quipu/util.h" ! 40: #include "quipu/ds_search.h" ! 41: ! 42: extern LLog * log_dsap; ! 43: extern char * TidyString2(); ! 44: ! 45: #define T61_MARK '$' ! 46: ! 47: static short exct = 0; ! 48: static char char_failed; ! 49: soundex_match (); ! 50: ! 51: static PE ia5enc (x) ! 52: char *x; ! 53: { ! 54: return (ia5s2prim(x,strlen(x))); ! 55: } ! 56: ! 57: static PE nstrenc (x) ! 58: char *x; ! 59: { ! 60: return (nums2prim(x,strlen(x))); ! 61: } ! 62: ! 63: ! 64: static PE octenc (x) ! 65: char *x; ! 66: { ! 67: return (oct2prim(x,strlen(x))); ! 68: } ! 69: ! 70: static PE strenc (x) ! 71: char *x; ! 72: { ! 73: if (*x == T61_MARK) { ! 74: x++; ! 75: return (t61s2prim(x,strlen(x))); ! 76: } else ! 77: return (prts2prim(x,strlen(x))); ! 78: } ! 79: ! 80: static char * local_t61 (a) ! 81: char * a; ! 82: { ! 83: char * b; ! 84: ! 85: if (a == NULLCP) ! 86: return (NULLCP); ! 87: ! 88: b = smalloc (strlen(a) +2); ! 89: *b++ = T61_MARK; ! 90: (void) strcpy (b,a); ! 91: (void) free (a); ! 92: return (--b); ! 93: } ! 94: ! 95: static char * prtsdec (pe) ! 96: PE pe; ! 97: { ! 98: int z; ! 99: ! 100: if (test_prim_pe (pe,PE_CLASS_UNIV,PE_DEFN_PRTS)) ! 101: return (TidyString2(prim2str(pe,&z))); ! 102: else ! 103: return (NULLCP); ! 104: } ! 105: ! 106: static char * cntydec (pe) ! 107: PE pe; ! 108: { ! 109: char *a; ! 110: ! 111: if ((a = prtsdec(pe)) == NULLCP) ! 112: return (NULLCP); ! 113: ! 114: if (strlen (a) != 2) { ! 115: LLOG (log_dsap,LLOG_EXCEPTIONS, ("Country code size wrong")); ! 116: return (NULLCP); ! 117: } ! 118: return (a); ! 119: ! 120: } ! 121: ! 122: static char * octsdec (pe) ! 123: PE pe; ! 124: { ! 125: int z; ! 126: ! 127: if (test_prim_pe (pe,PE_CLASS_UNIV,PE_PRIM_OCTS)) ! 128: return (TidyString2(prim2str(pe,&z))); ! 129: else ! 130: return (NULLCP); ! 131: ! 132: } ! 133: ! 134: static char * ia5sdec (pe) ! 135: PE pe; ! 136: { ! 137: int z; ! 138: ! 139: if (test_prim_pe (pe,PE_CLASS_UNIV,PE_DEFN_IA5S)) ! 140: return (TidyString2(prim2str(pe,&z))); ! 141: else ! 142: return (NULLCP); ! 143: } ! 144: ! 145: static char * numsdec (pe) ! 146: PE pe; ! 147: { ! 148: int z; ! 149: if (test_prim_pe (pe,PE_CLASS_UNIV,PE_DEFN_NUMS)) ! 150: return (TidyString2(prim2str(pe,&z))); ! 151: else ! 152: return (NULLCP); ! 153: } ! 154: ! 155: ! 156: static char * t61dec (pe) ! 157: PE pe; ! 158: { ! 159: int z; ! 160: ! 161: if (pe->pe_form != PE_FORM_PRIM) { ! 162: LLOG (log_dsap,LLOG_EXCEPTIONS,("Primative string expected")); ! 163: return NULLCP; ! 164: } ! 165: ! 166: if ( PE_ID (pe -> pe_class, pe -> pe_id) == PE_ID (PE_CLASS_UNIV,PE_DEFN_T61S) ) ! 167: return (local_t61 (TidyString2(prim2str(pe,&z)))); ! 168: else ! 169: return (prtsdec(pe)); ! 170: } ! 171: ! 172: static char * quotechar (a,b) ! 173: char a, *b; ! 174: { ! 175: (void) sprintf (b,"\\%02x", a & 0xff); ! 176: b += 3; ! 177: return (b); ! 178: } ! 179: ! 180: static char * unquotechar (a,b) ! 181: char *a, *b; ! 182: { ! 183: int val; ! 184: ! 185: if (*a == '\\') ! 186: *b = '\\'; ! 187: else { ! 188: (void) sscanf (a,"%2x", &val); ! 189: *b = val & 0xff; ! 190: a++; ! 191: } ! 192: return (a); ! 193: } ! 194: ! 195: ! 196: static check_print_string (str) ! 197: char * str; ! 198: { ! 199: ! 200: for (; *str != 0; str++) { ! 201: if (isalnum (*str)) ! 202: continue; ! 203: ! 204: switch (*str) { ! 205: case 047: /* ' */ ! 206: case '(': ! 207: case ')': ! 208: case '+': ! 209: case '-': ! 210: case '.': ! 211: case ',': ! 212: case '/': ! 213: case ':': ! 214: case '=': ! 215: case '?': ! 216: case ' ': continue; ! 217: default: LLOG (log_dsap,LLOG_NOTICE,("character '%c' not in printablestring",*str)); ! 218: char_failed = *str; ! 219: return (0); ! 220: } ! 221: } ! 222: return (1); ! 223: } ! 224: ! 225: ! 226: char * octparse (str) ! 227: char * str; ! 228: { ! 229: char buffer [BUFSIZ]; ! 230: register char * ptr=buffer; ! 231: ! 232: for (; *str != 0; str++) ! 233: if (*str != '\\') ! 234: *ptr++ = *str; ! 235: else { ! 236: str++; ! 237: str = unquotechar (str,ptr); ! 238: ptr++; ! 239: } ! 240: *ptr = 0; ! 241: return (strdup(buffer)); ! 242: } ! 243: ! 244: static char * prtparse_aux (str) ! 245: char * str; ! 246: { ! 247: if (check_print_string (str)) ! 248: return (strdup (str)); ! 249: else ! 250: return (NULLCP); ! 251: } ! 252: ! 253: char * prtparse (str) ! 254: char * str; ! 255: { ! 256: char * ptr; ! 257: ! 258: if ((ptr = prtparse_aux(str)) != NULLCP) ! 259: return (ptr); ! 260: else { ! 261: parse_error ("character '%c' not in printablestring",(char *)char_failed); ! 262: return (NULLCP); ! 263: } ! 264: } ! 265: ! 266: static char * cntyparse(str) ! 267: char * str; ! 268: { ! 269: char * a; ! 270: ! 271: if ((a=prtparse(str)) == NULLCP) ! 272: return (NULLCP); ! 273: ! 274: if (strlen (a) != 2) { ! 275: parse_error ("country code size wrong",NULLCP); ! 276: return (NULLCP); ! 277: } ! 278: ! 279: return (a); ! 280: } ! 281: ! 282: static char * t61parse (str) ! 283: char * str; ! 284: { ! 285: extern char t61_flag; ! 286: char * octparse (); ! 287: char * res; ! 288: ! 289: if (t61_flag) { ! 290: t61_flag = FALSE; /* recognised it !!! */ ! 291: return (local_t61(octparse (str))); /* need t61 parser */ ! 292: } else if ((res=prtparse_aux(str)) == NULLCP) { ! 293: LLOG (log_dsap,LLOG_NOTICE,("auto-convert to T.61 for '%s' ('%c' not allowed)",str,char_failed)); ! 294: return (local_t61(octparse (str))); ! 295: } else ! 296: return (res); ! 297: } ! 298: ! 299: char * cryptstring (str) ! 300: char * str; ! 301: { ! 302: register char * p; ! 303: /* This is a SIMPLE HACK to prevent passwords being revealed */ ! 304: /* at a glance. It buys virtually no extra security */ ! 305: ! 306: #define CRYPT_MASK 0x23 /* could tailor this */ ! 307: ! 308: for (p=str; *p != 0; p++) ! 309: if (*p != CRYPT_MASK) ! 310: *p ^= CRYPT_MASK; ! 311: ! 312: return (str); ! 313: } ! 314: ! 315: char * cryptparse (str) ! 316: char * str; ! 317: { ! 318: extern char crypt_flag; ! 319: char * octparse (); ! 320: ! 321: if (crypt_flag) { ! 322: crypt_flag = FALSE; /* recognised it !!! */ ! 323: return (cryptstring(octparse (str))); ! 324: } else ! 325: return (octparse (str)); ! 326: } ! 327: ! 328: sfree (x) ! 329: char *x; ! 330: { ! 331: free (x); ! 332: } ! 333: ! 334: pstrcmp (a,b) ! 335: char * a, *b; ! 336: { ! 337: int c; ! 338: if ((c= strcmp (a,b)) == 0) ! 339: return (0); ! 340: ! 341: if ( c > 0) ! 342: return (1); ! 343: else ! 344: return (-1); ! 345: } ! 346: ! 347: passwdcmp (a,b) ! 348: char * a, *b; ! 349: { ! 350: if (strcmp (a,b) == 0) ! 351: return (0); ! 352: else ! 353: return (2); ! 354: ! 355: } ! 356: ! 357: telcmp (a, b) ! 358: char *a, ! 359: *b; ! 360: { ! 361: register char c1, ! 362: c2; ! 363: ! 364: if (a == NULL) ! 365: return (b ? -1 : 0); ! 366: else ! 367: if (b == NULL) ! 368: return 1; ! 369: ! 370: for (;;) { ! 371: while (c1 = *a++) ! 372: if (c1 != ' ' && c1 != '-') ! 373: break; ! 374: ! 375: while (c2 = *b++) ! 376: if (c2 != ' ' && c2 != '-') ! 377: break; ! 378: ! 379: if (c1 == NULL) ! 380: return (c2 ? -1 : 0); ! 381: else ! 382: if (c2 == NULL) ! 383: return 1; ! 384: ! 385: if (c1 > c2) ! 386: return 1; ! 387: else ! 388: if (c1 < c2) ! 389: return -1; ! 390: } ! 391: } ! 392: ! 393: strprint (ps,str,format) ! 394: PS ps; ! 395: char * str; ! 396: int format; ! 397: { ! 398: if (*str == T61_MARK) { ! 399: if (format != READOUT) ! 400: ps_print (ps,"{T.61}"); ! 401: octprint (ps,++str,format); ! 402: } else ! 403: ps_print (ps,str); ! 404: } ! 405: ! 406: cryptprint (ps,str,format) ! 407: PS ps; ! 408: char * str; ! 409: int format; ! 410: { ! 411: char * ptr; ! 412: extern char allow_crypt; ! 413: ! 414: if (format == READOUT) ! 415: ps_print (ps,"HIDDEN"); ! 416: else { ! 417: if (! allow_crypt) { ! 418: octprint (ps,str,format); ! 419: return; ! 420: } ! 421: ps_print (ps,"{CRYPT}"); ! 422: ptr = strdup (str); ! 423: octprint (ps,cryptstring(ptr),format); ! 424: free ((char *)ptr); ! 425: } ! 426: } ! 427: ! 428: /* ARGSUSED */ ! 429: octprint (ps,str,format) ! 430: PS ps; ! 431: char * str; ! 432: int format; ! 433: { ! 434: char buffer [BUFSIZ]; ! 435: register char * ptr=buffer; ! 436: ! 437: for (; *str != 0; str++) { ! 438: if (isprint(*str)) { ! 439: if (format != READOUT) ! 440: switch (*str) { ! 441: case '&': /* used as seperators */ ! 442: case '#': ! 443: case '$': ! 444: case '%': ! 445: case '@': ! 446: ptr = quotechar (*str,ptr); ! 447: break; ! 448: default: ! 449: *ptr++ = *str; ! 450: if (*str == '\\') ! 451: *ptr++ = *str; ! 452: } ! 453: else ! 454: *ptr++ = *str; ! 455: } else ! 456: ptr = quotechar (*str,ptr); ! 457: } ! 458: *ptr = 0; ! 459: ps_print (ps,buffer); ! 460: } ! 461: ! 462: ! 463: case_exact_match (sntx) ! 464: short sntx; ! 465: { ! 466: if ((sntx < exct) || (sntx > (exct + 2))) ! 467: return (FALSE); ! 468: else ! 469: return (TRUE); ! 470: } ! 471: ! 472: approx_string (sntx) ! 473: short sntx; ! 474: { ! 475: if ((sntx < exct) || (sntx > (exct + 7))) ! 476: return (FALSE); ! 477: else ! 478: return (TRUE); ! 479: } ! 480: ! 481: sub_string (sntx) ! 482: short sntx; ! 483: { ! 484: if ((sntx < exct) || (sntx > (exct + 9))) ! 485: return (FALSE); ! 486: else ! 487: return (TRUE); ! 488: } ! 489: ! 490: ! 491: string_syntaxes () ! 492: { ! 493: /* Don't change ordering here unless you know ! 494: the side effects !!! */ ! 495: ! 496: /* 1-3 Exact string */ ! 497: /* 1-7 Approx */ ! 498: ! 499: exct = add_attribute_syntax ("caseexactstring", ! 500: (IFP) strenc, (IFP) t61dec, ! 501: (IFP) t61parse, strprint, ! 502: (IFP) strdup, pstrcmp, ! 503: sfree, NULLCP, ! 504: soundex_match, TRUE); ! 505: ! 506: (void) add_attribute_syntax ("TelephoneNumber", ! 507: (IFP) strenc, (IFP) prtsdec, ! 508: (IFP) prtparse, strprint, ! 509: (IFP) strdup, telcmp, ! 510: sfree, NULLCP, ! 511: soundex_match, TRUE); ! 512: ! 513: (void) add_attribute_syntax ("printablestring", ! 514: (IFP) strenc, (IFP) prtsdec, ! 515: (IFP) prtparse, strprint, ! 516: (IFP) strdup, pstrcmp, ! 517: sfree, NULLCP, ! 518: soundex_match, TRUE); ! 519: ! 520: (void) add_attribute_syntax ("ia5string", ! 521: (IFP) ia5enc, (IFP) ia5sdec, ! 522: (IFP) octparse, octprint, ! 523: (IFP) strdup, pstrcmp, ! 524: sfree, NULLCP, ! 525: soundex_match, TRUE); ! 526: ! 527: /* 5-8 ignore strings */ ! 528: ! 529: (void) add_attribute_syntax ("countrystring", ! 530: (IFP) strenc, (IFP) cntydec, ! 531: (IFP) cntyparse,strprint, ! 532: (IFP) strdup, lexequ, ! 533: sfree, NULLCP, ! 534: soundex_match, TRUE); ! 535: ! 536: (void) add_attribute_syntax ("DestinationString", ! 537: (IFP) strenc, (IFP) prtsdec, ! 538: (IFP) prtparse, strprint, ! 539: (IFP) strdup, lexequ, ! 540: sfree, NULLCP, ! 541: soundex_match, TRUE); ! 542: ! 543: (void) add_attribute_syntax ("caseignorestring", ! 544: (IFP) strenc, (IFP) t61dec, ! 545: (IFP) t61parse, strprint, ! 546: (IFP) strdup, lexequ, ! 547: sfree, NULLCP, ! 548: soundex_match, TRUE); ! 549: ! 550: (void) add_attribute_syntax ("caseIgnoreIa5string", ! 551: (IFP) ia5enc, (IFP) ia5sdec, ! 552: (IFP) octparse, octprint, ! 553: (IFP) strdup, lexequ, ! 554: sfree, NULLCP, ! 555: soundex_match, TRUE); ! 556: ! 557: /* 1-10 -> substrings */ ! 558: (void) add_attribute_syntax ("numericstring", ! 559: (IFP) nstrenc, (IFP) numsdec, ! 560: (IFP) strdup, strprint, ! 561: (IFP) strdup, pstrcmp, ! 562: sfree, NULLCP, ! 563: NULLIFP, FALSE); ! 564: ! 565: (void) add_attribute_syntax ("octetstring", ! 566: (IFP) octenc, (IFP) octsdec, ! 567: (IFP) octparse, octprint, ! 568: (IFP) strdup, pstrcmp, ! 569: sfree, NULLCP, ! 570: NULLIFP, TRUE); ! 571: ! 572: (void) add_attribute_syntax ("password", ! 573: (IFP) octenc, (IFP) octsdec, ! 574: (IFP) cryptparse, cryptprint, ! 575: (IFP) strdup, passwdcmp, ! 576: sfree, NULLCP, ! 577: NULLIFP, TRUE); ! 578: } ! 579:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.