You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdewebdev/kxsldbg/kxsldbgpart/libxsldbg/files_unix.cpp

227 lines
6.9 KiB

/***************************************************************************
files_unix.c - file functions *nix platform
specific
-------------------
begin : Tue Jan 29 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 "xsldbg.h"
#include "files.h"
#include "utils.h"
#include "options.h"
#include <cstdlib>
static char *tempNames[2] = { NULL, NULL };
/**
* filesPlatformInit:
*
* Intialize the platform specific files module
*
* This is a platform specific interface
*
*
* Returns 1 if sucessful
* 0 otherwise
*/
int
filesPlatformInit(void)
{
const char *namePrefix = "/tmp/";
int nameIndex;
int result = 1;
/* The "base" names for files files to use */
const char *names[] = {
"_xsldbg_tmp1.txt",
"_xsldbg_tmp2.txt"
};
if (getenv("USER")) {
for (nameIndex = 0; nameIndex < 2; nameIndex++) {
tempNames[nameIndex] = (char*)
xmlMalloc(strlen(namePrefix) + strlen(getenv("USER")) +
strlen(names[nameIndex]) + 1);
if (tempNames[nameIndex]) {
xmlStrCpy(tempNames[nameIndex], namePrefix);
xmlStrCat(tempNames[nameIndex], getenv("USER"));
xmlStrCat(tempNames[nameIndex], names[nameIndex]);
} else {
xsldbgGenericErrorFunc(i18n("Error: Out of memory.\n"));
break;
result = 0;
}
}
} else {
xsldbgGenericErrorFunc(i18n("Error: USER environment variable is not set.\n"));
}
return result;
}
/**
* filesPlatformFree:
*
* Free memory used by the platform specific files module
*
* This is a platform specific interface
*
*/
void
filesPlatformFree(void)
{
int nameIndex;
for (nameIndex = 0; nameIndex < 2; nameIndex++) {
if (tempNames[nameIndex])
xmlFree(tempNames[nameIndex]);
}
}
/**
* filesTempFileName:
* @fileNumber : Number of temp file required
*
* Return the name of tempfile. For each call to this function
* with the same @fileNumber the same file name will be returned
* File number : 0 is used by cat command
* File number : 1 is used by profiling output
*
* This is a platform specific interface
*
* Returns The name of temp file to be used for temporary results,
* NULL otherwise
*/
const char *
filesTempFileName(int fileNumber)
{
const char *result = NULL;
if ((fileNumber < 0) || ((fileNumber + 1) > 2)){ //don't use > (int) sizeof(tempNames), it depends on the platform and is wrong even on i586
#ifdef WITH_XSLDBG_DEBUG_PROCESS
xsltGenericError(xsltGenericErrorContext,
"Error: Unable to allocate temporary file %d for xsldbg\n",
fileNumber);
#endif
}else{
result = tempNames[fileNumber];
}
return result;
}
/**
* filesExpandName:
* @fileName : A valid fileName
*
* Converts a fileName to an absolute path
* If operating system supports it a leading "~" in the fileName
* will be converted to the user's home path. Otherwise
* the same name will be returned
*
* Returns A copy of the converted @fileName or a copy of
* the @fileName as supplied. May return NULL
*/
xmlChar *
filesExpandName(const xmlChar * fileName)
{
xmlChar *result = NULL;
if (fileName) {
if ((fileName[0] == '~') && getenv("HOME")) {
result =
(xmlChar *) xmlMalloc(xmlStrLen(fileName) +
strlen(getenv("HOME")) + 1);
if (result) {
xmlStrCpy(result, getenv("HOME"));
xmlStrCat(result, &fileName[1]);
} else {
xsldbgGenericErrorFunc(i18n("Error: Out of memory.\n"));
}
} else if (!xmlStrnCmp(fileName, "file:/", 6)){
/* return a copy of the corrected path */
result = filesURItoFileName(fileName);
}else{
/* return a copy only */
result = xmlStrdup(fileName);
}
}
return result;
}
/**
* filesSearchFileName:
* @fileType : Is valid
*
* Return a copy of the file name to use as an argument to searching
*
* Returns A copy of the file name to use as an argument to searching
*/
xmlChar *
filesSearchFileName(FilesSearchFileNameEnum fileType)
{
xmlChar *result = NULL;
int type = fileType;
int preferHtml = optionsGetIntOption(OPTIONS_PREFER_HTML);
const xmlChar *baseDir = NULL;
const xmlChar *name = NULL;
static const char *searchNames[] = {
/* Note: File names here are in native format, to be appended to the
* help directory name or search results path
*/
/* First list names when prefer html is false */
"searchresult.xml", /* input */
"search.xsl", /* stylesheet to use */
"searchresult.txt", /* where to put the result */
/*Now for the names to use when prefer html is true */
"searchresult.xml", /* input */
"searchhtml.xsl", /* stylesheet to use */
"searchresult.html" /* where to put the result */
};
if (!optionsGetStringOption(OPTIONS_DOCS_PATH)
|| !filesSearchResultsPath()) {
xsldbgGenericErrorFunc(i18n("Error: The value of the option docspath or searchresultspath is empty. See help on setoption or options command for more information.\n"));
return result;
}
name = (xmlChar *) searchNames[(preferHtml * 3) + type];
switch (type) {
case FILES_SEARCHINPUT:
baseDir = filesSearchResultsPath();
break;
case FILES_SEARCHXSL:
baseDir = optionsGetStringOption(OPTIONS_DOCS_PATH);
break;
case FILES_SEARCHRESULT:
baseDir = filesSearchResultsPath();
break;
}
result = (xmlChar*)xmlMalloc(xmlStrLen(baseDir) + xmlStrLen(name) + 1);
if (result) {
xmlStrCpy(result, baseDir);
xmlStrCat(result, name);
}
return result;
}