static void copy_file_to_dest(const char *dest_dir, const char *src_dir, const char *filepath) { char *dest_path = NULL; char *src_path = NULL; int i; /* create dest path */ dest_path = make_path(dest_dir, filepath); if (!dest_path) goto done; /* create source path */ src_path = make_path(src_dir, filepath); if (!src_path) goto done; /* create partial directories */ for (i = strlen(dest_dir) + 1; dest_path[i]; i++) { if (osd_is_path_separator(dest_path[i])) { dest_path[i] = '\0'; osd_mkdir(dest_path); dest_path[i] = PATH_SEPARATOR[0]; } } osd_copyfile(dest_path, src_path); done: if (dest_path) free(dest_path); if (src_path) free(src_path); }
int osd_is_absolute_path(const char *path) { int result; if (osd_is_path_separator(path[0])) result = TRUE; #if !defined(SDLMAME_WIN32) && !defined(SDLMAME_OS2) else if (path[0] == '.') result = TRUE; #else #ifndef UNDER_CE else if (*path && path[1] == ':') result = TRUE; #endif #endif else result = FALSE; return result; }
static void combine_path(char *buf, size_t buflen, const char *relpath) { size_t i; for (i = 0; buf[i]; i++) { if (osd_is_path_separator(buf[i])) buf[i] = PATH_SEPARATOR[0]; } while(osd_is_path_separator(buf[--i])) ; i++; buf[i++] = PATH_SEPARATOR[0]; buf[i] = '\0'; while(relpath[0]) { /* skip over './' constructs */ while ((relpath[0] == '.') && osd_is_path_separator(relpath[1])) relpath += 2; while((relpath[0] == '.') && (relpath[1] == '.') && osd_is_path_separator(relpath[2])) { while(i && osd_is_path_separator(buf[--i])) buf[i] = '\0'; while(i && !osd_is_path_separator(buf[i])) buf[i--] = '\0'; relpath += 3; } snprintf(&buf[i], buflen - i, "%s", relpath); relpath += strlen(&buf[i]); i += strlen(&buf[i]); } }
int messdocs(const char *toc_filename, const char *dest_dir, const char *help_project_filename, const char *help_contents_filename, const char *help_filename) { char buf[4096]; struct messdocs_state state; int len; int done; FILE *in; FILE *chm_hhp; int i; char *s; XML_Memory_Handling_Suite memcallbacks; memset(&state, 0, sizeof(state)); state.m_pool = pool_alloc_lib(NULL); /* open the DOC */ in = fopen(toc_filename, "r"); if (!in) { fprintf(stderr, "Cannot open TOC file '%s'\n", toc_filename); goto error; } /* figure out the TOC directory */ state.m_toc_dir = pool_strdup_lib(state.m_pool, toc_filename); if (!state.m_toc_dir) goto outofmemory; for (i = strlen(state.m_toc_dir) - 1; (i > 0) && !osd_is_path_separator(state.m_toc_dir[i]); i--) state.m_toc_dir[i] = '\0'; /* clean the target directory */ rmdir_recursive(dest_dir); osd_mkdir(dest_dir); /* create the help contents file */ s = (char*)pool_malloc_lib(state.m_pool, strlen(dest_dir) + 1 + strlen(help_project_filename) + 1); if (!s) goto outofmemory; strcpy(s, dest_dir); strcat(s, PATH_SEPARATOR); strcat(s, help_contents_filename); state.m_chm_toc = fopen(s, "w"); state.m_dest_dir = dest_dir; if (!state.m_chm_toc) { fprintf(stderr, "Cannot open file %s\n", s); goto error; } fprintf(state.m_chm_toc, "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML//EN\"\n"); fprintf(state.m_chm_toc, "<HTML>\n"); fprintf(state.m_chm_toc, "<HEAD>\n"); fprintf(state.m_chm_toc, "</HEAD>\n"); fprintf(state.m_chm_toc, "<BODY>\n"); fprintf(state.m_chm_toc, "<OBJECT type=\"text/site properties\">\n"); fprintf(state.m_chm_toc, "\t<param name=\"Window Styles\" value=\"0x800625\">\n"); fprintf(state.m_chm_toc, "\t<param name=\"ImageType\" value=\"Folder\">\n"); fprintf(state.m_chm_toc, "\t<param name=\"Font\" value=\"Arial,8,0\">\n"); fprintf(state.m_chm_toc, "</OBJECT>\n"); fprintf(state.m_chm_toc, "<UL>\n"); /* create the XML parser */ memcallbacks.malloc_fcn = expat_malloc; memcallbacks.realloc_fcn = expat_realloc; memcallbacks.free_fcn = expat_free; state.m_parser = XML_ParserCreate_MM(NULL, &memcallbacks, NULL); if (!state.m_parser) goto outofmemory; XML_SetUserData(state.m_parser, &state); XML_SetElementHandler(state.m_parser, start_handler, end_handler); XML_SetCharacterDataHandler(state.m_parser, data_handler); do { len = (int) fread(buf, 1, sizeof(buf), in); done = feof(in); if (XML_Parse(state.m_parser, buf, len, done) == XML_STATUS_ERROR) { process_error(&state, NULL, NULL); break; } } while(!done); fprintf(state.m_chm_toc, "</UL>\n"); fprintf(state.m_chm_toc, "</BODY></HTML>"); fclose(state.m_chm_toc); /* create the help project file */ s = (char*)pool_malloc_lib(state.m_pool, strlen(dest_dir) + 1 + strlen(help_project_filename) + 1); if (!s) goto outofmemory; strcpy(s, dest_dir); strcat(s, PATH_SEPARATOR); strcat(s, help_project_filename); chm_hhp = fopen(s, "w"); if (!chm_hhp) { fprintf(stderr, "Cannot open file %s\n", s); goto error; } fprintf(chm_hhp, "[OPTIONS]\n"); fprintf(chm_hhp, "Compiled file=%s\n", help_filename); fprintf(chm_hhp, "Contents file=%s\n", help_contents_filename); fprintf(chm_hhp, "Default topic=%s\n", state.m_default_topic); fprintf(chm_hhp, "Language=0x409 English (United States)\n"); fprintf(chm_hhp, "Title=%s\n", state.m_title); fprintf(chm_hhp, "\n"); fclose(chm_hhp); /* finish up */ XML_ParserFree(state.m_parser); fclose(in); pool_free_lib(state.m_pool); return state.m_error ? -1 : 0; outofmemory: fprintf(stderr, "Out of memory"); error: if (state.m_chm_toc) fclose(state.m_chm_toc); if (in) fclose(in); return -1; }