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