|
|
|
|
|
|
|
/**************************************************************************
|
|
|
|
utils.c - misc utils
|
|
|
|
|
|
|
|
-------------------
|
|
|
|
begin : Thur Jan 31 2002
|
|
|
|
copyright : (C) 2001 by Keith Isdale
|
|
|
|
email : k_isdale@tpg.com.au
|
|
|
|
**************************************************************************/
|
|
|
|
|
|
|
|
/**************************************************************************
|
|
|
|
* *
|
|
|
|
* This program is free software; you can redistribute it and/or modify *
|
|
|
|
* it under the terms of the GNU General Public License as published by *
|
|
|
|
* the Free Software Foundation; either version 2 of the License, or *
|
|
|
|
* (at your option) any later version. *
|
|
|
|
* *
|
|
|
|
**************************************************************************/
|
|
|
|
|
|
|
|
#include "utils.h"
|
|
|
|
|
|
|
|
/**
|
|
|
|
* trimString:
|
|
|
|
* @text : A valid string with leading or trailing spaces
|
|
|
|
*
|
|
|
|
* Remove leading and trailing spaces off @text
|
|
|
|
* stores result back into @text
|
|
|
|
*
|
|
|
|
* Returns 1 on success,
|
|
|
|
* 0 otherwise
|
|
|
|
*/
|
|
|
|
int
|
|
|
|
trimString(xmlChar * text)
|
|
|
|
{
|
|
|
|
int result = 0;
|
|
|
|
xmlChar *start, *end;
|
|
|
|
|
|
|
|
if (text && xmlStrlen(text)) {
|
|
|
|
start = text;
|
|
|
|
end = text + xmlStrLen(text) - 1;
|
|
|
|
while (_IS_BLANK(*start) && (start <= end))
|
|
|
|
start++;
|
|
|
|
|
|
|
|
while (_IS_BLANK(*end) && (end >= start))
|
|
|
|
end--;
|
|
|
|
|
|
|
|
/* copy to @text */
|
|
|
|
while (start <= end) {
|
|
|
|
*text = *start;
|
|
|
|
text++;
|
|
|
|
start++;
|
|
|
|
}
|
|
|
|
|
|
|
|
*text = '\0';
|
|
|
|
result = 1;
|
|
|
|
}
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* splitString:
|
|
|
|
* @textIn: The string to split
|
|
|
|
* @maxStrings: The max number of strings to put into @out
|
|
|
|
* @out: Is valid and at least the size of @maxStrings
|
|
|
|
*
|
|
|
|
* Split string by white space and put into @out
|
|
|
|
*
|
|
|
|
* Returns 1 on success,
|
|
|
|
* 0 otherwise
|
|
|
|
*/
|
|
|
|
int
|
|
|
|
splitString(xmlChar * textIn, int maxStrings, xmlChar ** out)
|
|
|
|
{
|
|
|
|
int wordCount = 0;
|
|
|
|
int foundQuote = 0;
|
|
|
|
|
|
|
|
if (!textIn || !out)
|
|
|
|
return wordCount;
|
|
|
|
|
|
|
|
|
|
|
|
while ((*textIn != '\0') && (wordCount < maxStrings)) {
|
|
|
|
/*skip the first spaces ? */
|
|
|
|
while (_IS_BLANK(*textIn))
|
|
|
|
textIn++;
|
|
|
|
|
|
|
|
if (*textIn == '\"') {
|
|
|
|
textIn++;
|
|
|
|
foundQuote = 1;
|
|
|
|
}
|
|
|
|
out[wordCount] = textIn;
|
|
|
|
|
|
|
|
/* look for end of word */
|
|
|
|
if (foundQuote == 0) {
|
|
|
|
while (!_IS_BLANK(*textIn) && (*textIn != '\0'))
|
|
|
|
textIn++;
|
|
|
|
|
|
|
|
if (*textIn != '\0') {
|
|
|
|
*textIn = '\0';
|
|
|
|
textIn++;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (xmlStrLen(out[wordCount]) > 0) {
|
|
|
|
wordCount++;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
/* look for ending quotation mark */
|
|
|
|
while ((*textIn != '\0') && (*textIn != '\"'))
|
|
|
|
textIn++;
|
|
|
|
if (*textIn == '\0') {
|
|
|
|
xsldbgGenericErrorFunc(i18n("Error: Unmatched quotes in input.\n"));
|
|
|
|
wordCount = 0;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
*textIn = '\0';
|
|
|
|
textIn++; /* skip the '"' which is now a '\0' */
|
|
|
|
foundQuote = 0;
|
|
|
|
wordCount++;
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if (*textIn != '\0')
|
|
|
|
wordCount = 0; /* We have not processed all the text givent to us */
|
|
|
|
return wordCount;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* lookupName:
|
|
|
|
* @name : Is valid
|
|
|
|
* @matchList : A NULL terminated list of names to use as lookup table
|
|
|
|
*
|
|
|
|
* Lookup and name in a list
|
|
|
|
*
|
|
|
|
* Returns The id of name found in @matchList,
|
|
|
|
* 0 otherwise
|
|
|
|
*/
|
|
|
|
int
|
|
|
|
lookupName(xmlChar * name, xmlChar ** matchList)
|
|
|
|
{
|
|
|
|
int result = -1, nameIndex;
|
|
|
|
|
|
|
|
if (!name || !matchList)
|
|
|
|
return result;
|
|
|
|
|
|
|
|
for (nameIndex = 0; matchList[nameIndex]; nameIndex++) {
|
|
|
|
if (xmlStrEqual(name, matchList[nameIndex])) {
|
|
|
|
result = nameIndex;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* fullTQName:
|
|
|
|
* @nameURI : TQName part of name
|
|
|
|
* @name : Local part of name
|
|
|
|
*
|
|
|
|
* Join nameURI to name
|
|
|
|
*
|
|
|
|
* Returns a copy of "nameURI:name"
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
xmlChar * fullTQName(const xmlChar* nameURI, const xmlChar * name)
|
|
|
|
{
|
|
|
|
xmlChar *result = NULL;
|
|
|
|
if (!nameURI && !name)
|
|
|
|
result = xmlStrdup((xmlChar*)"");
|
|
|
|
else{
|
|
|
|
if (nameURI == NULL){
|
|
|
|
result = xmlStrdup(name);
|
|
|
|
}else{
|
|
|
|
result = (xmlChar*) xmlMalloc(sizeof(char) * (
|
|
|
|
xmlStrLen(name) +
|
|
|
|
xmlStrLen(nameURI) + 3));
|
|
|
|
if (result)
|
|
|
|
sprintf((char*)result, "%s:%s", (char*)nameURI, (char*)name);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|