DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download
Index: T s

⟦72cef7467⟧ TextFile

    Length: 9958 (0x26e6)
    Types: TextFile
    Names: »string.c«

Derivation

└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0
    └─⟦35176feda⟧ »EurOpenD22/isode/isode-6.tar.Z« 
        └─⟦de7628f85⟧ 
            └─⟦this⟧ »isode-6.0/dsap/common/string.c« 

TextFile

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