Subversion Repositories DevTools

Rev

Blame | Last modification | View Log | RSS feed

/* -*- mode: c; tabs: 4 -*- */
/*****************************************************************************
* Module name   : util.c
* Module type   : CMDFILE source file
* Environment(s): n/a
*
* Description:
*
    Util - Misc functions
*
* Version   Who     Date        Description
            APY     12/99       Created
                    23/06/04    StringPath
*
* $Source: /cvsroot/device/DEVL/UTILS/CMDFILE/util.c,v $
* $Revision: 1.6 $ $Date: 2004/10/11 08:59:27 $ $State: Exp $
* $Author: ayoung $ $Locker:  $
*...........................................................................*/

#include <stdio.h>
#include <stdlib.h>
#include "cmdfile.h"

/*  ************************** String functions  ************************   */

int
StringInit(
    String_t *pStr, char *pBuf, unsigned len)
{
    pStr->s_len = pStr->s_left = len;
    if (pBuf == NULL)
        if ((pBuf = malloc(len)) == NULL)
             return (-1);
    pStr->s_ptr = pStr->s_data = pBuf;
    return (0);
}


int
StringZero(
    String_t *pStr)
{
    pStr->s_left = pStr->s_len;
    pStr->s_ptr = pStr->s_data;
    return (0);
}


int
StringCat(
    String_t *pStr, const char *pBuf)
{
    return StringCatn(pStr, pBuf, strlen(pBuf));
}


int
StringCatn(
    String_t *pStr, const char *pBuf, unsigned len)
{
    if (len > pStr->s_left) {
        verbose( "macro buffer overflow" );
        return (ENOSPC);
    }
    pStr->s_left -= len;
    (void) memcpy(pStr->s_ptr, pBuf, len);
    pStr->s_ptr += len;
    return (0);
}


static int
CopyPath( const char *str, char *buf )
{
    int     len = 0;

    if (whitespace == WS_ESCAPE) {
        const char *c;                          /* escape spaces */
        char *b = buf;

        for (c = str; *c; *c++) {
            if (*c == ' ')
                *b++ = '\\', len++;
            *b++ = *c;
        }
        *b = '\0';

    } else if (whitespace == WS_QUOTE) {
        sprintf( buf, "\"%s\"", str );
        len = 2;

    } else if (whitespace == WS_URL) {
        const char *c;
        char *b = buf;

        for (c = str; *c; *c++) {
            if ( *c >= 127 ||
                strchr( "$&+,;=?@ \"<>{}|^~[]`", *c ) )
            {                                   /* convert */
                *b++ = '%';
                (void) sprintf( b, "%-2.2X", *c );
                b += 2;
                len += 2;
            } else {                            /* quote */
                *b++ = *c;
            }
        }
        *b = '\0';

    } else {                                    /* unknown/ignore */
        static int spacewarning;

        if (whitespace == WS_UNKNOWN && !spacewarning) {
            warning( "embedded spaces encountered within path, specify -W option\n" );
            spacewarning++;
        }
        strcpy(buf, str);
    }
    return (len);
}


int
StringPath(
    String_t *pStr, const char *pPath)
{
    unsigned len, white;
    const char *p;

    if (pPath == NULL)
        return 0;                               /* NULL string */

    for (len = 0, white = 0, p = pPath; *p; *p++) {
        if (*p == ' ') white++;
        len++;
    }

    if (!white) {
        StringCatn(pStr, pPath, len);

    } else {
        if (len + white > pStr->s_left) {       /* worst case */
            verbose( "macro buffer overflow" );
            return (ENOSPC);
        }
        white = CopyPath( pPath, pStr->s_ptr );
        pStr->s_left -= (len + white);
        pStr->s_ptr += (len + white);
    }

    if (len > PATH_MAX) {
        static int lengthwarning;

        if (!lengthwarning) {
            warning( "encountered path greater then %d in length\n", PATH_MAX );
            lengthwarning++;
        }

    }
    return (len);
}



int
StringPut(
    String_t *pStr, char c)
{
    if (pStr->s_left == 0) {
        verbose( "macro buffer overflow" );
        return (ENOSPC);
    }
    *pStr->s_ptr++ = c;
    pStr->s_left--;
    return (0);
}


char *
StringData(
    String_t *pStr)
{
    if (pStr->s_left <= 0)
        return (char *)"!! OVERFLOW !!";
    if (pStr->s_left > pStr->s_len)
        return (char *)"!! UNDERFLOW !!";
    *pStr->s_ptr = '\0';
    return (pStr->s_data);
}