dir_visit_next_op_t accept_input_file(const char * full, const char * base, void * ctx) { if (strcmp(file_name_suffix(base), "xml") == 0) { dr_metalib_builder_add_file((dr_metalib_builder_t)ctx, NULL, full); } return dir_visit_next_go; }
dr_metalib_source_t dr_metalib_builder_add_file(dr_metalib_builder_t builder, const char * name, const char * file) { dr_metalib_source_t source; struct mem_buffer name_buffer; size_t file_len; const char * suffix; dr_metalib_source_format_t format; assert(builder); assert(file); suffix = file_name_suffix(file); if (suffix == NULL) return 0; if (strcmp(suffix, "xml") == 0) { format = dr_metalib_source_format_xml; } else { return NULL; } mem_buffer_init(&name_buffer, 0); if (name == NULL) { name = file_name_base(file, &name_buffer); if (name == NULL) { mem_buffer_clear(&name_buffer); return NULL; } } assert(name); file_len = strlen(file) + 1; source = dr_metalib_source_create(builder, name, file_len, dr_metalib_source_type_file, format, dr_metalib_source_from_user); if (source == NULL) { mem_buffer_clear(&name_buffer); return NULL; } memcpy(source + 1, file, file_len); mem_buffer_clear(&name_buffer); return source; }