|
|
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);
}