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 DescriptionAPY 12/99 Created23/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 ************************ */intStringInit(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);}intStringZero(String_t *pStr){pStr->s_left = pStr->s_len;pStr->s_ptr = pStr->s_data;return (0);}intStringCat(String_t *pStr, const char *pBuf){return StringCatn(pStr, pBuf, strlen(pBuf));}intStringCatn(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 intCopyPath( 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);}intStringPath(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);}intStringPut(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);}