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