|
|
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 a
Length: 3333 (0xd05)
Types: TextFile
Names: »ap_val2str.c«
└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0
└─⟦dc59850a2⟧ »EurOpenD22/pp5.0/pp-5.tar.Z«
└─⟦e5a54fb17⟧
└─⟦this⟧ »pp-5.0/Lib/addr/ap_val2str.c«
/* ap_val2str: converts values to strings */
# ifndef lint
static char Rcsid[] = "@(#)$Header: /cs/research/pp/hubris/pp-beta/Lib/addr/RCS/ap_val2str.c,v 5.0 90/09/20 16:04:25 pp Exp Locker: pp $";
# endif
/*
* $Header: /cs/research/pp/hubris/pp-beta/Lib/addr/RCS/ap_val2str.c,v 5.0 90/09/20 16:04:25 pp Exp Locker: pp $
*
* $Log: ap_val2str.c,v $
* Revision 5.0 90/09/20 16:04:25 pp
* rcsforce : 5.0 public release
*
*/
/*
This function is just barely usable. The hole problem of
quoted strings is hard to get right especially when the
mail system is trying to make up for human forgetfulness.
-DPK-
SEK - have improved this somewhat by giving knowledge of
various object types. Does not handle strings of spaces.
*/
#include "util.h"
#include "ap.h"
void ap_val2str (buf, value, obtype) /* -- convert to canonical str -- */
char *buf,
*value,
obtype;
{
int got_spcl;
int in_quote;
register char *from_ptr,
*to_ptr;
PP_DBG (("Lib/addr/ap_val2str ('%s', '%d')", value, obtype));
if (obtype == AP_COMMENT) {
for (from_ptr = value, to_ptr = buf; *from_ptr != '\0';
*to_ptr++ = *from_ptr++)
switch (*from_ptr) {
case '\r':
case '\n':
case '\\':
case '(':
case ')':
*to_ptr++ = '\\';
}
*to_ptr = '\0';
return;
}
if (obtype == AP_DOMAIN_LITERAL) {
for (from_ptr = value, to_ptr = buf; *from_ptr != '\0';
*to_ptr++ = *from_ptr++)
switch (*from_ptr) {
case '\r':
case '\n':
case '\\':
*to_ptr++ = '\\';
continue;
case '[':
if (from_ptr != value)
*to_ptr++ = '\\';
continue;
case ']':
if (*(from_ptr + 1) != (char) 0)
*to_ptr++ = '\\';
}
*to_ptr = '\0';
return;
}
in_quote = FALSE;
for (got_spcl = FALSE, from_ptr = value; *from_ptr != '\0';
from_ptr++) {
switch (*from_ptr) {
case '"':
/* -- flip-flop -- */
in_quote = (in_quote == TRUE ? FALSE : TRUE);
break;
case '\\':
case '\r':
case '\n':
if (in_quote == FALSE) {
got_spcl = TRUE;
goto copyit;
}
break;
case '<':
case '>':
case '@':
case ',':
case ';':
case ':':
case '\t':
case '[':
case ']':
case '(':
case ')':
if (in_quote == FALSE) {
got_spcl = TRUE;
goto copyit;
}
break;
case ' ':
if (in_quote == FALSE)
if ((obtype == AP_DOMAIN) ||
(obtype == AP_MAILBOX)) {
got_spcl = TRUE;
goto copyit;
}
else {
/* -- hacked to handle " at " -- */
/* -- this really is needed -- */
if ((uptolow (*(from_ptr + 1))
== 'a') &&
(uptolow (*(from_ptr + 2))
== 't') &&
(*(from_ptr + 3)
== ' ')) {
got_spcl = TRUE;
goto copyit;
}
}
break;
case '.':
if (in_quote == FALSE &&
((obtype == AP_GROUP_START) ||
(obtype == AP_PERSON_START))) {
got_spcl = TRUE;
goto copyit;
}
break;
}
}
/* -- if were in a quote, something's wrong -- */
got_spcl = in_quote;
copyit:
to_ptr = buf;
if (got_spcl)
*to_ptr++ = '"';
for (from_ptr = value; *from_ptr != '\0'; *to_ptr++ = *from_ptr++)
switch (*from_ptr) {
case '\r':
case '\n':
case '\\':
case '"':
if (got_spcl)
*to_ptr++ = '\\';
}
if (got_spcl)
*to_ptr++ = '"';
*to_ptr = '\0';
}