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 a

⟦0286fa898⟧ TextFile

    Length: 3314 (0xcf2)
    Types: TextFile
    Names: »arg2str.c«

Derivation

└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0
    └─⟦dc59850a2⟧ »EurOpenD22/pp5.0/pp-5.tar.Z« 
        └─⟦e5a54fb17⟧ 
            └─⟦this⟧ »pp-5.0/Lib/util/arg2str.c« 

TextFile

/* arg2str: list of arguments to string */

# ifndef lint
static char Rcsid[] = "@(#)$Header: /cs/research/pp/hubris/pp-beta/Lib/util/RCS/arg2str.c,v 5.0 90/09/20 16:17:00 pp Exp Locker: pp $";
# endif

/*
 * $Header: /cs/research/pp/hubris/pp-beta/Lib/util/RCS/arg2str.c,v 5.0 90/09/20 16:17:00 pp Exp Locker: pp $
 *
 * $Log:	arg2str.c,v $
 * Revision 5.0  90/09/20  16:17:00  pp
 * rcsforce : 5.0 public release
 * 
 */



#include "util.h"
#include "retcode.h"

extern void err_abrt ();

/* convert an array of strings to one or more lines of 'arguments'.
 *
 * this is intended to be used along with the str2arg() routine.
 */

void arg2vstr (linelen, maxlen, buf, argv) /* convert the list to a string */
    int linelen;
    int maxlen;                         /* length of string */
    char *buf;                          /* where to put the output string */
    char **argv;                        /* the argument vector */
{
    unsigned totlen,                    /* total length of current line */
	     len;                       /* length of current argument */
    unsigned gotdelim;                  /* a delimiter char is in arg */
    unsigned gotpair;                   /* key/value pair */
    char tmpstr[BUFSIZ];		/* string under construction  */
    register char *src,
		  *dest = NULLCP;

    for (totlen = gotpair = 0, buf[0] = '\0';
		*argv != (char *) 0; argv++)
    {
	if (gotpair  == 0 && strcmp ("=", *argv) == 0)
	{
	    dest = tmpstr;
	    gotpair = 2;     /* take the next two arguments  */
	    continue;
	}


	if(**argv == '\0'){
		gotdelim = TRUE;
		goto nextone;
	}
	for (src = *argv, gotdelim = FALSE; *src != '\0'; src++)
	    switch (*src)
	    {
		case ' ':
		case '\t':
		case '=':
		case ',':
		case ';':
		case ':':
		case '/':
		case '|':
		case '.':
		    gotdelim = TRUE;
		    goto nextone;
	    }

    nextone:
	if (gotpair == 0)
	    dest = tmpstr;
	if (gotdelim)
	    *dest++ = '"';
	for (src = *argv; *src != '\0'; src++)
	{
	    switch (*src)
	    {
		case '\b':
		    *dest++ = '\\';
		    *dest++ = 'b';
		    break;

		case '\t':
		    *dest++ = '\\';
		    *dest++ = 't';
		    break;

		case '\f':
		    *dest++ = '\\';
		    *dest++ = 'f';
		    break;

		case '\r':
		    *dest++ = '\\';
		    *dest++ = 'r';
		    break;

		case '\n':
		    *dest++ = '\\';
		    *dest++ = 'n';
		    break;

		case '\\':              /*  Added by Doug Kingston  */
		case '\"':
		    *dest++ = '\\';
		    *dest++ = *src;
		    break;

		default:
		    if (iscntrl (*src))
		    {
			*dest++ = '\\';
			*dest++ = ((*src >> 6) & 07) + '0';
			*dest++ = ((*src >> 3) & 07) + '0';
			*dest++ =  (*src & 07) + '0';
		    }
		    else
			*dest++ = *src;
	    }
	}

	if (gotdelim)
	    *dest++ = '"';

	switch (gotpair)        /* handle key/value differently         */
	{
	    case 2:
		*dest++ = '=';
		gotpair--;
		continue;

	    case 1:
		gotpair = 0;
	}

	*dest = '\0';
	len = dest - tmpstr;

	if (totlen != 0)
	{
	    if ((linelen > 0) && ((totlen + len) > linelen))
	    {
		(void) strcat (buf, "\n\t");
		maxlen -= 2;
		totlen = 8;
	    }
	    else
	    {
		(void) strcat (buf, " ");
		maxlen --;
		totlen += 1;
	    }
	}
	if (maxlen < len)
		err_abrt (RP_MECH, "String too long in arg2vstr");
	maxlen -= len;
	(void) strcat (buf, tmpstr);
	totlen += len;
    }
}