keep on fixing absolute_name

This commit is contained in:
Vítor Santos Costa 2016-02-22 12:59:49 +00:00
parent 588ef40a16
commit 712d79c7bb
2 changed files with 30 additions and 60 deletions

View File

@ -1,3 +1,4 @@
/************************************************************************* *
* YAP Prolog *
* Yap Prolog was developed at NCCUP - Universidade do Porto *
@ -2348,7 +2349,7 @@ X_API Int YAP_Init(YAP_init_args *yap_init) {
int restore_result;
int do_bootstrap = (yap_init->YapPrologBootFile != NULL);
CELL Trail = 0, Stack = 0, Heap = 0, Atts = 0;
char boot_file[256];
char boot_file[YAP_FILENAME_MAX+1];
static int initialized = FALSE;
/* ignore repeated calls to YAP_Init */
@ -2367,7 +2368,7 @@ X_API Int YAP_Init(YAP_init_args *yap_init) {
GLOBAL_argc = yap_init->Argc;
#if BOOT_FROM_SAVED_STATE
if (!yap_init->SavedState) {
yap_init->SavedState = Yap_locateFile(YAP_STARTUP, LOCAL_FileNameBuf, sizeof(LOCAL_FileNameBuf)-1);
yap_init->SavedState = Yap_locateFile(YAP_STARTUP, boot_file, sizeof(boot_file)-1);
}
#else

View File

@ -294,11 +294,12 @@ Yap_IsAbsolutePath(const char *p0)
// this is necessary because
// support for ~expansion at the beginning
// systems like Android do not do this.
static char *
PlExpandVars (const char *source)
static const char *
PlExpandVars (const char *source, const char *root, char *result)
{
const char *src = source;
char *result = LOCAL_FileNameBuf;
if (!result)
result = malloc(YAP_FILENAME_MAX+1);
if (strlen(source) >= YAP_FILENAME_MAX) {
Yap_Error(SYSTEM_ERROR_OPERATING_SYSTEM, TermNil, "%s in true_file-name is larger than the buffer size (%d bytes)", source, strlen(source));
@ -376,7 +377,21 @@ PlExpandVars (const char *source)
strcpy( result, src);
}
else {
strncpy (result, source, YAP_FILENAME_MAX);
size_t tocp = strlen(src);
if (root) {
tocp = strlen(root)+1;
}
if (tocp > YAP_FILENAME_MAX) {
Yap_Error(SYSTEM_ERROR_OPERATING_SYSTEM, MkStringTerm(src), "path too long");
return NULL;
}
if (root) {
strncpy (result, root, YAP_FILENAME_MAX );
strncat ( result, "/", YAP_FILENAME_MAX);
strncat ( result, source, YAP_FILENAME_MAX);
} else {
strncpy (result, source, strlen(src)+1 );
}
}
return result;
}
@ -618,14 +633,15 @@ Yap_AbsoluteFile(const char *spec, bool ok)
{
const char*p;
const char*rc;
rc = expandVars(spec);
rc = PlExpandVars(spec, NULL, NULL);
if (!rc)
return spec;
rc = spec;
if ((p = myrealpath(rc) ) ) {
return p;
} else {
return NULL;
}
freeBuffer( rc );
}
/**
@ -676,11 +692,8 @@ do_glob(const char *spec, bool glob_vs_wordexp)
if (spec == NULL) {
return TermNil;
}
const char *espec = PlExpandVars( spec );
#if _WIN32 || defined(__MINGW32__)
{
char u[YAP_FILENAME_MAX+1];
WIN32_FIND_DATA find;
HANDLE hFind;
CELL *dest;
@ -718,6 +731,8 @@ do_glob(const char *spec, bool glob_vs_wordexp)
return tf;
}
#elif HAVE_WORDEXP || HAVE_GLOB
char * espec = u;
strncpy( espec, spec, sizeof(u));
/* Expand the string for the program to run. */
size_t pathcount;
#if HAVE_GLOB
@ -881,7 +896,7 @@ static const param_t expand_filename_defs[] = {EXPAND_FILENAME_DEFS()};
static Term
do_expand_file_name(Term t1, Term opts USES_REGS)
{
{
xarg *args;
expand_filename_enum_choices_t i;
bool use_system_expansion = true;
@ -1349,50 +1364,6 @@ working_directory(USES_REGS1)
return true;
}
static const char *
expandWithPrefix(const char *source, const char *root, char *target, bool expand)
{
char *work;
if (expand)
work = (char *)expandVars( source );
else {
if (!target)
target = malloc(YAP_FILENAME_MAX);
work = target;
if (root) {
strncpy( work, root , YAP_FILENAME_MAX-1 );
strncat( work, "/" , YAP_FILENAME_MAX-1 );
strncat( work, source , YAP_FILENAME_MAX-1 );
} else {
strncpy( work, source , YAP_FILENAME_MAX-1 );
}
return work;
}
// expand names first
if (root && !Yap_IsAbsolutePath( source ) ) {
const char *s = expandVars( source);
if (!s)
return source;
const char *r0 = expandVars( root);
size_t sl = strlen(s);
size_t rl = strlen(r0);
if (!target)
target = malloc(YAP_FILENAME_MAX);
char *r = target;
strncat( r, r0, sl+rl+2 );
strncat( r, "/", sl+rl+2 );
strncat( r, s , sl+rl+2);
return r;
} else {
if (target != work) {
strncpy( target, work, sizeof(LOCAL_FileNameBuf)-1);
freeBuffer( work );
}
return target;
}
}
/** Yap_findFile(): tries to locate a file, no expansion should be performed/
*
*
@ -1410,7 +1381,6 @@ static const char *
const char*
Yap_findFile (const char *isource, const char * idef, const char *iroot, char *result, bool access, file_type_t ftype, bool expand_root, bool in_lib)
{
char save_buffer[YAP_FILENAME_MAX+1];
const char *root, *source = isource;
int rc = FAIL_RESTORE;
@ -1506,8 +1476,7 @@ Yap_findFile (const char *isource, const char * idef, const char *iroot, char *
if (done)
continue;
// { CACHE_REGS __android_log_print(ANDROID_LOG_ERROR, __FUNCTION__, "root= %s %s ", root, source) ; }
const char *work = expandWithPrefix( source, root, result, false );
const char *work = PlExpandVars( source, root, result);
// expand names in case you have
// to add a prefix
@ -1554,7 +1523,7 @@ p_expand_file_name ( USES_REGS1 )
text = Yap_TextTermToText( t, NULL, 0);
if (!text)
return false;
if (!(text2 = PlExpandVars (text)))
if (!(text2 = PlExpandVars (text, NULL, NULL)))
return false;
freeBuffer( text );
bool rc = Yap_unify(ARG2, Yap_MkTextTerm(text2, t));