static char *get_filelist_name() { char *dir_name = NULL; char *filename; #ifndef DISABLE_CONFIGFILES dir_name = get_fizmo_config_dir_name(); #endif // DISABLE_CONFIGFILES if (dir_name == NULL) return NULL; filename = malloc(strlen(dir_name) + 16); strcpy(filename, dir_name); strcat(filename, "/story-list.txt"); return filename; }
struct babel_info *load_babel_info() { struct babel_info *result = NULL; #ifndef DISABLE_BABEL char *cwd = NULL; char *config_dir_name = NULL; z_dir *config_dir; struct z_dir_ent z_dir_entry; time_t last_mod_timestamp; z_file *new_babel_doc_file; xmlDocPtr new_babel_doc; #ifndef DISABLE_CONFIGFILES config_dir_name = get_fizmo_config_dir_name(); #endif // DISABLE_CONFIGFILES if ((config_dir = fsi->open_dir(config_dir_name)) == NULL) return NULL; cwd = fsi->get_cwd(); if (fsi->ch_dir(config_dir_name) != 0) { fsi->close_dir(config_dir); free(cwd); return NULL; } result = (struct babel_info*)fizmo_malloc(sizeof(struct babel_info)); result->entries = NULL; result->entries_allocated = 0; result->nof_entries = 0; while (fsi->read_dir(&z_dir_entry, config_dir) == 0) { if ( (fsi->is_filename_directory(z_dir_entry.d_name) == false) && (strlen(z_dir_entry.d_name) >= 9) && (strcasecmp( z_dir_entry.d_name + strlen(z_dir_entry.d_name) - 9, ".iFiction") == 0) ) { if ((new_babel_doc = xmlReadFile( z_dir_entry.d_name, NULL, XML_PARSE_NOWARNING | XML_PARSE_NOERROR)) != NULL) { if ((new_babel_doc_file = fsi->openfile( z_dir_entry.d_name, FILETYPE_DATA, FILEACCESS_READ)) == NULL) { free_babel_info(result); fsi->ch_dir(cwd); free(cwd); fsi->close_dir(config_dir); return NULL; } last_mod_timestamp = fsi->get_last_file_mod_timestamp(new_babel_doc_file); fsi->closefile(new_babel_doc_file); if ((add_doc_to_babel_info( new_babel_doc, result, last_mod_timestamp, z_dir_entry.d_name)) != 0) { xmlFreeDoc(new_babel_doc); free_babel_info(result); fsi->ch_dir(cwd); free(cwd); fsi->close_dir(config_dir); return NULL; } } } } fsi->ch_dir(cwd); free(cwd); fsi->close_dir(config_dir); #endif return result; }