Ejemplo n.º 1
0
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);
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
0
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);
}
Ejemplo n.º 4
0
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);
}