# Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: krishnan.parthasarathi@example.com-20110324185405-\ # q6wi7lgy87bj9oz5 # target_branch: bzr://bzr.savannah.gnu.org/pdf/libgnupdf/trunk/ # testament_sha1: b7d58cede36a1e76597c37eb3ae0934cd9e339db # timestamp: 2011-03-25 00:24:27 +0530 # base_revision_id: jemarch@gnu.org-20110318193334-yyl4luvuj0bk3z0c # # Begin patch === modified file 'src/base/pdf-fsys-disk.c' --- src/base/pdf-fsys-disk.c 2011-02-17 20:59:39 +0000 +++ src/base/pdf-fsys-disk.c 2011-03-24 18:54:05 +0000 @@ -111,6 +111,20 @@ static const pdf_char_t * __pdf_fsys_disk_get_mode_string(const enum pdf_fsys_file_mode_e mode); +static pdf_char_t* +__pdf_fsys_disk_build_host_path(const pdf_char_t *host_path1, + const pdf_char_t *host_path2); + +static pdf_bool_t +__pdf_fsys_disk_is_absolute_host_path(const pdf_char_t *host_path); + +static const pdf_char_t* +__pdf_fsys_disk_skip_root(const pdf_char_t* host_path); + +static pdf_char_t* +__pdf_fsys_disk_canonicalize_host_path(const pdf_char_t *host_path); + + #ifdef PDF_HOST_WIN32 static pdf_bool_t __pdf_fsys_disk_win32_device_p (pdf_text_t path); @@ -624,7 +638,34 @@ if((path_name != NULL) && \ (parent_path != NULL)) { - /* TODO: This involves getting an absolute path from a relative path */ + pdf_char_t *host_path = NULL; + pdf_size_t host_path_size; + if (__pdf_fsys_disk_get_host_path (path_name, + &host_path, + &host_path_size) != PDF_OK) + { + PDF_DEBUG_BASE ("Couldn't get host path to get parent"); + ret_code = PDF_ERROR; + } + else + { + pdf_char_t *normalized_path = __pdf_fsys_disk_canonicalize_host_path(host_path); + pdf_char_t *host_parent = dirname(normalized_path); + + if(pdf_text_new_from_unicode(host_parent, strlen(host_parent), + PDF_TEXT_UTF8, &parent_path) != PDF_OK) + { + ret_code = PDF_ENOMEM; + } + else + { + + ret_code = PDF_OK; + } + + free(normalized_path); + pdf_dealloc(host_path); + } } return ret_code; @@ -1632,4 +1673,126 @@ } +#ifdef PDF_HOST_WIN32 +#define DIR_SEPARATOR '\\' +#define DIR_SEPARATOR_S "\\" +#define IS_DIR_SEPARATOR(c) (((c) == '/') || ((c) == '\\')) + +#else /* !PDF_HOST_WIN32 */ +#define DIR_SEPARATOR '/' +#define DIR_SEPARATOR_S "//" +#define IS_DIR_SEPARATOR(c) ((c) == '/') +#endif + +static pdf_char_t* +__pdf_fsys_disk_build_host_path(const pdf_char_t *a, const pdf_char_t *b) +{ + pdf_char_t *full_path = (pdf_char_t*) malloc(strlen(a)+strlen(b)+2); + + strncpy(full_path, a, strlen(a)); + strncat(full_path, DIR_SEPARATOR_S, 1); + strncat(full_path, b, strlen(b)); + + return full_path; +} + +static pdf_bool_t +__pdf_fsys_disk_is_absolute_host_path(const pdf_char_t *host_path) +{ + if(!host_path) + return PDF_FALSE; + + if(IS_DIR_SEPARATOR(*host_path)) + return PDF_TRUE; + + return PDF_FALSE; +} + +static const pdf_char_t* +__pdf_fsys_disk_skip_root(const pdf_char_t* host_path) +{ + const pdf_char_t *p = host_path; + while(p != 0 && IS_DIR_SEPARATOR(*p)) + p++; + + return p; +} + +static pdf_char_t* +__pdf_fsys_disk_canonicalize_host_path(const pdf_char_t *host_path) +{ + pdf_char_t *begin, *prev, *cur; + pdf_char_t *canon_path; + + if(!__pdf_fsys_disk_is_absolute_host_path(host_path)) + { + pdf_char_t *cwd = getcwd(NULL, 0); + canon_path = __pdf_fsys_disk_build_host_path(cwd, host_path); + free(cwd); + } + else + { + canon_path = strdup(host_path); + } + + begin = __pdf_fsys_disk_skip_root(canon_path); + + /* Collapse all leading '/' */ + cur = begin-1; + while(cur > canon_path+1 && IS_DIR_SEPARATOR(*cur)) cur--; + if(cur != begin-1) + { + memmove(cur, begin, strlen(begin)+1); + begin = cur; + } + + while(*cur != 0) + { + if(cur[0] == '.' && (cur[1] == 0 + || IS_DIR_SEPARATOR(cur[1]))) + { + memmove(cur, cur+1, strlen(cur+1)+1); + + } + else if(cur[0] == '.' && cur[1] == '.' + && (cur[2] == 0 || IS_DIR_SEPARATOR(cur[2]))) + { + prev = cur - 2; + cur = cur + 2; + if(prev < begin) + prev = begin; + while(prev > begin && !IS_DIR_SEPARATOR(*prev)) + prev--; + if(IS_DIR_SEPARATOR(*prev)) + *prev++ = DIR_SEPARATOR; + memmove(prev, cur, strlen(cur)+1); + cur = prev; + } + else + { + while(*cur != 0 && !IS_DIR_SEPARATOR(*cur)) + cur++; + if(*cur != 0) + *cur++ = DIR_SEPARATOR; + } + /* Collapse '/'s that occur together in path_name*/ + prev = cur; + while(*cur != 0 && IS_DIR_SEPARATOR(*cur)) + cur++; + if(prev != cur) + memmove(prev, cur, strlen(cur)+1); + cur = prev; + } + + /* Removing trailing '/'s */ + cur--; + while(cur > begin && IS_DIR_SEPARATOR(*cur)) + { + *cur = 0; + cur--; + } + + return canon_path; +} + /* End of pdf-fsys-disk.c */ # Begin bundle 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 7kinChIO51bgAA==