Two less open_memstream calls.

This commit is contained in:
Pere Pujal i Carabantes 2010-05-10 17:29:00 +00:00
parent c198e9daff
commit 94277d1e70

View file

@ -2085,7 +2085,7 @@ static void mainloop(void)
magic_switchout(canvas); magic_switchout(canvas);
if (tool_avail[TOOL_UNDO]) if (tool_avail[TOOL_UNDO])
{ {
hide_blinking_cursor(); hide_blinking_cursor();
if (cur_undo == newest_undo) if (cur_undo == newest_undo)
{ {
@ -12067,27 +12067,33 @@ static int do_save(int tool, int dont_show_success_results)
static void set_chunk_data(unsigned char **chunk_data, size_t * chunk_data_len, size_t uncompressed_size, Bytef * data, static void set_chunk_data(unsigned char **chunk_data, size_t * chunk_data_len, size_t uncompressed_size, Bytef * data,
size_t dataLen) size_t dataLen)
{ {
FILE *fi; int headersLen;
size_t size;
unsigned int i; unsigned int i;
char * line, * headers, * cdata;
headersLen = 0;
headers = calloc(256, 1);
line = calloc(256, 1);
fi = open_memstream((char **) chunk_data, &size); strcat(headers, "Tuxpaint\n");
strcat(headers, "Tuxpaint_" VER_VERSION "\n");
sprintf(line, "%d%s", uncompressed_size, "\n");
strcat(headers, line);
sprintf(line, "%d%s", dataLen, "\n");
strcat(headers, line);
/* First the header */ headersLen = strlen(headers);
fprintf(fi, "Tuxpaint\n"); *chunk_data_len = headersLen + dataLen;
fprintf(fi, "Tuxpaint_" VER_VERSION "\n");
fprintf(fi, "%d\n", uncompressed_size); cdata = calloc(*chunk_data_len, sizeof(unsigned char *));
fprintf(fi, "%d\n", dataLen); strcat(cdata, headers);
/* Add the data */
for (i = 0; i < dataLen; i++) for (i = 0; i < dataLen; i++)
{ cdata[headersLen + i] = data[i];
fwrite(&data[i], sizeof(data[i]), 1, fi); *chunk_data = (unsigned char *) cdata;
}
fclose(fi); free(line);
*chunk_data_len = size; free(headers);
} }
@ -12124,7 +12130,6 @@ static void do_png_embed_data(png_structp png_ptr)
png_unknown_chunk tuxpaint_chunks[5]; png_unknown_chunk tuxpaint_chunks[5];
size_t size_of_uncompressed_label_data, chunk_data_len; size_t size_of_uncompressed_label_data, chunk_data_len;
FILE *fi_stream;
unsigned char *sbk_pixs; unsigned char *sbk_pixs;
uLongf compressedLen; uLongf compressedLen;
unsigned char *chunk_data; unsigned char *chunk_data;
@ -12137,7 +12142,7 @@ static void do_png_embed_data(png_structp png_ptr)
int alpha_size; int alpha_size;
Uint32 i; Uint32 i;
struct label_node *current_node; struct label_node *current_node;
char *char_stream; char *char_stream, *line;
size_t dat_size; size_t dat_size;
lfi = open_memstream(&ldata, &size_of_uncompressed_label_data); lfi = open_memstream(&ldata, &size_of_uncompressed_label_data);
@ -12423,18 +12428,29 @@ static void do_png_embed_data(png_structp png_ptr)
if (starter_id[0] != '\0' || if (starter_id[0] != '\0' ||
template_id[0] != '\0' || canvas_color_r != 255 || canvas_color_g != 255 || canvas_color_b != 255) template_id[0] != '\0' || canvas_color_r != 255 || canvas_color_g != 255 || canvas_color_b != 255)
{ {
fi_stream = open_memstream(&char_stream, &dat_size); /* Usually the .dat data are less than 100 bytes, hope this keeps line and char_stream in the safe side */
if (fi_stream != NULL) line = calloc(256, 1);
{ char_stream = calloc(256 + sizeof(starter_id) + sizeof(template_id) , 1);
fprintf(fi_stream, "%s\n", starter_id);
fprintf(fi_stream, "%d %d %d\n", starter_mirrored, starter_flipped, starter_personal); sprintf(char_stream, "%s\n", starter_id);
fprintf(fi_stream, "c%d %d %d\n", canvas_color_r, canvas_color_g, canvas_color_b);
fprintf(fi_stream, "T%s\n", template_id); sprintf(line, "%d %d %d\n", starter_mirrored, starter_flipped, starter_personal);
fprintf(fi_stream, "%d\n", template_personal); strcat(char_stream, line);
fprintf(fi_stream, "M%d\n", starter_modified);
sprintf(line, "c%d %d %d\n", canvas_color_r, canvas_color_g, canvas_color_b);
strcat(char_stream, line);
sprintf(line, "T%s\n", template_id);
strcat(char_stream, line);
sprintf(line, "%d\n", template_personal);
strcat(char_stream, line);
sprintf(line, "M%d\n", starter_modified);
strcat(char_stream, line);
dat_size = strlen(char_stream);
fclose(fi_stream);
}
set_chunk_data(&chunk_data, &chunk_data_len, dat_size, (Bytef *) char_stream, dat_size); set_chunk_data(&chunk_data, &chunk_data_len, dat_size, (Bytef *) char_stream, dat_size);
tuxpaint_chunks[4].data = chunk_data; tuxpaint_chunks[4].data = chunk_data;
@ -12449,6 +12465,7 @@ static void do_png_embed_data(png_structp png_ptr)
png_write_chunk(png_ptr, tuxpaint_chunks[4].name, tuxpaint_chunks[4].data, tuxpaint_chunks[4].size); png_write_chunk(png_ptr, tuxpaint_chunks[4].name, tuxpaint_chunks[4].data, tuxpaint_chunks[4].size);
free(char_stream); free(char_stream);
free(line);
free(chunk_data); free(chunk_data);
} }
} }