void load_text_from_file(struct ft2_source *srcdata, const char *filename) { FILE *tmp_file = NULL; uint32_t filesize = 0; char *tmp_read = NULL; uint16_t header = 0; size_t bytes_read; tmp_file = os_fopen(filename, "rb"); if (tmp_file == NULL) { if (!srcdata->file_load_failed) { blog(LOG_WARNING, "Failed to open file %s", filename); srcdata->file_load_failed = true; } return; } fseek(tmp_file, 0, SEEK_END); filesize = (uint32_t)ftell(tmp_file); fseek(tmp_file, 0, SEEK_SET); bytes_read = fread(&header, 2, 1, tmp_file); if (bytes_read == 2 && header == 0xFEFF) { // File is already in UTF-16 format if (srcdata->text != NULL) { bfree(srcdata->text); srcdata->text = NULL; } srcdata->text = bzalloc(filesize); bytes_read = fread(srcdata->text, filesize - 2, 1, tmp_file); srcdata->m_timestamp = get_modified_timestamp(srcdata->text_file); bfree(tmp_read); fclose(tmp_file); return; } fseek(tmp_file, 0, SEEK_SET); srcdata->m_timestamp = get_modified_timestamp(srcdata->text_file); tmp_read = bzalloc(filesize + 1); bytes_read = fread(tmp_read, filesize, 1, tmp_file); fclose(tmp_file); if (srcdata->text != NULL) { bfree(srcdata->text); srcdata->text = NULL; } srcdata->text = bzalloc((strlen(tmp_read) + 1)*sizeof(wchar_t)); os_utf8_to_wcs(tmp_read, strlen(tmp_read), srcdata->text, (strlen(tmp_read) + 1)); remove_cr(srcdata->text); bfree(tmp_read); }
static gavl_source_status_t next_packet(bgav_subtitle_converter_t * cnv, bgav_packet_t ** ret_p, int force) { gavl_source_status_t st; bgav_packet_t * in_packet; char * pos; int in_len; bgav_packet_t * ret; if(!force && ((st = cnv->src.peek_func(cnv->src.data, NULL, 0)) != GAVL_SOURCE_OK)) return st; in_packet = NULL; if((st = cnv->src.get_func(cnv->src.data, &in_packet)) != GAVL_SOURCE_OK) return st; /* Make sure we have a '\0' at the end */ if(in_packet->data_size > 0) { pos = (char*)&in_packet->data[in_packet->data_size-1]; in_len = in_packet->data_size; while(*pos == '\0') { pos--; in_len--; if(in_len < 0) break; } if(in_len < 0) in_len = 0; } else in_len = 0; if(cnv->cnv && in_len) { ret = bgav_packet_pool_get(cnv->s->pp); /* Convert character set */ if(!bgav_convert_string_realloc(cnv->cnv, (const char *)in_packet->data, in_len, &ret->data_size, (char **)&ret->data, &ret->data_alloc)) { bgav_packet_pool_put(cnv->s->pp, in_packet); bgav_packet_pool_put(cnv->s->pp, ret); return GAVL_SOURCE_EOF; } bgav_packet_copy_metadata(ret, in_packet); bgav_packet_pool_put(cnv->s->pp, in_packet); } else { ret = in_packet; ret->data_size = in_len; } /* Remove \r */ remove_cr((char*)ret->data, &ret->data_size); PACKET_SET_KEYFRAME(ret); if(ret_p) *ret_p = ret; return GAVL_SOURCE_OK; }
void parse(const char *filename) { FILE *f, *h, *cpp; const char *ext, *basename; char *input; long len; /* make sure the extension is .async */ ext = strrchr(filename, '.'); if(ext == 0 || strcmp(".async", ext) != 0) { return; } /* open the input file */ f = fopen(filename, "rb"); if(f == 0) { fprintf(stderr, "%s:0: error: cannot open file\n", filename); return; } /* open the output files */ basename = strrchr(filename, '/'); if(basename == 0) { basename = strrchr(filename, '\\'); if(basename == 0) { basename = filename; } else { basename++; } } else { basename++; } len = static_cast<long>(strlen(basename) - size_t(6)); // strlen(".async") == 6 h = open_output(basename, len, ".h"); cpp = open_output(basename, len, ".c++"); if(h == 0 || cpp == 0) { if(h != 0) { fclose(h); } if(cpp != 0) { fclose(cpp); } fclose(f); return; } input = read_input(filename, f); if(input != 0) { // mo_event.h needs to be included from within the .async file! //fprintf(h, "#include <mo_event.h>\n"); // auto-include the header fprintf(cpp, "#include \"%.*s.h\"\n", static_cast<int>(len), basename); remove_cr(input); convert_file(filename, input, h, cpp); delete [] input; // Need extra newline at end of file to keep compiler from complaining. fprintf(h, "\n" ); } fclose(f); fclose(h); fclose(cpp); }
void read_from_end(struct ft2_source *srcdata, const char *filename) { FILE *tmp_file = NULL; uint32_t filesize = 0, cur_pos = 0; char *tmp_read = NULL; uint16_t value = 0, line_breaks = 0; size_t bytes_read; char bvalue; bool utf16 = false; tmp_file = fopen(filename, "rb"); if (tmp_file == NULL) { if (!srcdata->file_load_failed) { blog(LOG_WARNING, "Failed to open file %s", filename); srcdata->file_load_failed = true; } return; } bytes_read = fread(&value, 2, 1, tmp_file); if (bytes_read == 2 && value == 0xFEFF) utf16 = true; fseek(tmp_file, 0, SEEK_END); filesize = (uint32_t)ftell(tmp_file); cur_pos = filesize; while (line_breaks <= 6 && cur_pos != 0) { if (!utf16) cur_pos--; else cur_pos -= 2; fseek(tmp_file, cur_pos, SEEK_SET); if (!utf16) { bytes_read = fread(&bvalue, 1, 1, tmp_file); if (bytes_read == 1 && bvalue == '\n') line_breaks++; } else { bytes_read = fread(&value, 2, 1, tmp_file); if (bytes_read == 2 && value == L'\n') line_breaks++; } } if (cur_pos != 0) cur_pos += (utf16) ? 2 : 1; fseek(tmp_file, cur_pos, SEEK_SET); if (utf16) { if (srcdata->text != NULL) { bfree(srcdata->text); srcdata->text = NULL; } srcdata->text = bzalloc(filesize - cur_pos); bytes_read = fread(srcdata->text, (filesize - cur_pos), 1, tmp_file); remove_cr(srcdata->text); srcdata->m_timestamp = get_modified_timestamp(srcdata->text_file); bfree(tmp_read); fclose(tmp_file); return; } tmp_read = bzalloc((filesize - cur_pos) + 1); bytes_read = fread(tmp_read, filesize - cur_pos, 1, tmp_file); fclose(tmp_file); if (srcdata->text != NULL) { bfree(srcdata->text); srcdata->text = NULL; } srcdata->text = bzalloc((strlen(tmp_read) + 1)*sizeof(wchar_t)); os_utf8_to_wcs(tmp_read, strlen(tmp_read), srcdata->text, (strlen(tmp_read) + 1)); remove_cr(srcdata->text); srcdata->m_timestamp = get_modified_timestamp(srcdata->text_file); bfree(tmp_read); }