From a182a36067d962802a49921a735dce53ceb5afb8 Mon Sep 17 00:00:00 2001 From: Chris Young Date: Wed, 14 Jul 2010 22:36:04 +0000 Subject: More intelligent path concatenation svn path=/trunk/netsurf/; revision=10639 --- render/directory.c | 121 +++++++++++++++++++++++++++++------------------------ 1 file changed, 66 insertions(+), 55 deletions(-) (limited to 'render/directory.c') diff --git a/render/directory.c b/render/directory.c index 6ff149713..70b754d0a 100644 --- a/render/directory.c +++ b/render/directory.c @@ -145,6 +145,8 @@ bool directory_convert(struct content *c) { struct stat filestat; char *filepath, *mimetype = NULL; int filepath_size; + char *urlpath; + int urlpath_size; char moddate[100]; char modtime[100]; bool extendedinfo, evenrow = false; @@ -196,8 +198,6 @@ bool directory_convert(struct content *c) { if (res == URL_FUNC_OK) { res = url_compare(content__get_url(c), up, false, &compare); if ((res == URL_FUNC_OK) && !compare) { - if (up[strlen(up) - 1] == '/') - up[strlen(up) - 1] = '\0'; snprintf(buffer, sizeof(buffer), "

%s

", up, messages_get("FileParent")); @@ -257,68 +257,79 @@ bool directory_convert(struct content *c) { return false; } - /* Start row and print item name */ - snprintf(buffer, sizeof(buffer), - "" + urlpath_size = strlen(content__get_url(c)) + strlen(entry->d_name) + 2; + urlpath = malloc(urlpath_size); + if (urlpath != NULL) { + strcpy(urlpath, content__get_url(c)); + if(urlpath[strlen(urlpath) - 1] != '/') + strncat(urlpath, "/", urlpath_size); + strncat(urlpath, entry->d_name, urlpath_size); + + /* Start row and print item name */ + snprintf(buffer, sizeof(buffer), + "" "%s ", - content__get_url(c), entry->d_name, + urlpath, evenrow ? "even" : "odd", S_ISDIR(filestat.st_mode) ? "dir" : "file", entry->d_name); - binding_parse_chunk(c->data.html.parser_binding, - (uint8_t *) buffer, strlen(buffer)); - - if (extendedinfo == true) { - /* Get date in output format */ - if (strftime((char *)&moddate, sizeof moddate, - "%a %d %b %Y", - localtime(&filestat.st_mtime)) == 0) - strncpy(moddate, "-", sizeof moddate); - /* Get time in output format */ - if (strftime((char *)&modtime, sizeof modtime, - "%H:%M", - localtime(&filestat.st_mtime)) == 0) - strncpy(modtime, "-", sizeof modtime); - - if (S_ISDIR(filestat.st_mode)) { - /* Directory: Print type and date/time */ - snprintf(buffer, sizeof(buffer), - "%s " - "" - " " - "%s " - "%s\n", - messages_get("FileDirectory"), - moddate, modtime); + binding_parse_chunk(c->data.html.parser_binding, + (uint8_t *) buffer, strlen(buffer)); + + if (extendedinfo == true) { + /* Get date in output format */ + if (strftime((char *)&moddate, sizeof moddate, + "%a %d %b %Y", + localtime(&filestat.st_mtime)) == 0) + strncpy(moddate, "-", sizeof moddate); + /* Get time in output format */ + if (strftime((char *)&modtime, sizeof modtime, + "%H:%M", + localtime(&filestat.st_mtime)) == 0) + strncpy(modtime, "-", sizeof modtime); + + if (S_ISDIR(filestat.st_mode)) { + /* Directory: Print type and date/time */ + snprintf(buffer, sizeof(buffer), + "%s " + "" + " " + "%s " + "%s\n", + messages_get("FileDirectory"), + moddate, modtime); + } else { + /* File: Print type, size, and date/time */ + mimetype = fetch_mimetype(filepath); + snprintf(buffer, sizeof(buffer), + "%s " + "%d" + "%s " + "%s " + "%s\n", + mimetype, + filesize_value( + (unsigned long)filestat.st_size), + messages_get(filesize_unit( + (unsigned long)filestat.st_size)), + moddate, modtime); + } } else { - /* File: Print type, size, and date/time */ - mimetype = fetch_mimetype(filepath); + /* Not got info, print empty cells */ snprintf(buffer, sizeof(buffer), - "%s " - "%d" - "%s " - "%s " - "%s\n", - mimetype, - filesize_value( - (unsigned long)filestat.st_size), - messages_get(filesize_unit( - (unsigned long)filestat.st_size)), - moddate, modtime); + " " + "" + " " + " " + "\n"); } - } else { - /* Not got info, print empty cells */ - snprintf(buffer, sizeof(buffer), - " " - "" - " " - " " - "\n"); - } - binding_parse_chunk(c->data.html.parser_binding, - (uint8_t *) buffer, strlen(buffer)); + binding_parse_chunk(c->data.html.parser_binding, + (uint8_t *) buffer, strlen(buffer)); + + free(urlpath); + } if (evenrow == false) evenrow = true; -- cgit v1.2.3