diff --git a/s7.c b/s7.c index 2b8b69a..8d2f9df 100644 --- a/s7.c +++ b/s7.c @@ -25558,23 +25558,32 @@ s7_pointer s7_load(s7_scheme *sc, const char *filename) static block_t *full_filename(s7_scheme *sc, const char *filename) { s7_int len; - char *pwd, *rtn; + char *rtn; block_t *block; - pwd = getcwd(NULL, 0); /* docs say this means it will return a new string of the right size */ - len = safe_strlen(pwd) + safe_strlen(filename) + 8; - block = mallocate(sc, len * sizeof(char)); - rtn = (char *)block_data(block); - if (pwd) - { - rtn[0] = '\0'; - catstrs(rtn, len, pwd, "/", filename, NULL); - free(pwd); - } - else - { + if (filename[0] == '/') { + len = safe_strlen(filename) + 8; + block = mallocate(sc, len * sizeof(char)); + rtn = (char *)block_data(block); memcpy((void *)rtn, (void *)filename, len); - rtn[len] = '\0'; - } + rtn[len-1] = '\0'; + } + else { + char *pwd = getcwd(NULL, 0); /* docs say this means it will return a new string of the right size */ + len = safe_strlen(pwd) + safe_strlen(filename) + 8; + block = mallocate(sc, len * sizeof(char)); + rtn = (char *)block_data(block); + if (pwd) + { + rtn[0] = '\0'; + catstrs(rtn, len, pwd, "/", filename, NULL); + free(pwd); + } + else + { + memcpy((void *)rtn, (void *)filename, len); + rtn[len-1] = '\0'; + } + } return(block); } #endif