root / proj / src / xpm_utils.c @ 275
History | View | Annotate | Download (1.36 KB)
1 | 182 | up20180642 | #ifdef LCOM_MACRO
|
---|---|---|---|
2 | #include <lcom/lcf.h> |
||
3 | #endif
|
||
4 | |||
5 | #include "xpm_utils.h" |
||
6 | |||
7 | #include <stdio.h> |
||
8 | #include <stdlib.h> |
||
9 | #include <string.h> |
||
10 | |||
11 | 219 | up20180642 | void xpm_save_as_xpm2(const char **p, const char *s){ |
12 | 182 | up20180642 | FILE *f = fopen(s, "w");
|
13 | int w, h, num_colors, chars_per_pixel;
|
||
14 | sscanf(p[0], "%d %d %d %d", &w, &h, &num_colors, &chars_per_pixel); |
||
15 | for(int i = 0; i < 1+num_colors+h; ++i){ |
||
16 | fprintf(f, "%s\n", p[i]);
|
||
17 | } |
||
18 | fclose(f); f = NULL;
|
||
19 | } |
||
20 | |||
21 | char** xpm_load_xpm2(const char *fpath){ |
||
22 | FILE *f = fopen(fpath, "r");
|
||
23 | if(f == NULL) return NULL; |
||
24 | 192 | up20180642 | size_t len = 1024; char *line_buf = malloc(len*sizeof(char)); |
25 | 182 | up20180642 | int sz;
|
26 | |||
27 | char **ret = NULL; |
||
28 | |||
29 | int w, h, num_colors, chars_per_pixel;
|
||
30 | |||
31 | sz = getline(&line_buf, &len, f);{ |
||
32 | sscanf(line_buf, "%d %d %d %d", &w, &h, &num_colors, &chars_per_pixel);
|
||
33 | ret = malloc((1+num_colors+h)*sizeof(char*)); |
||
34 | } |
||
35 | 183 | up20180642 | ret[0] = malloc((sz+1)*sizeof(char)); if(ret[0] == NULL){ free(ret); return NULL; } |
36 | 182 | up20180642 | strcpy(ret[0], line_buf);
|
37 | 183 | up20180642 | |
38 | 182 | up20180642 | for(int i = 1; i < 1+num_colors+h; ++i){ |
39 | sz = getline(&line_buf, &len, f); |
||
40 | ret[i] = malloc((sz+1)*sizeof(char)); |
||
41 | 183 | up20180642 | if(ret[i] == NULL){ |
42 | for(int j = 0; j < i; ++j) |
||
43 | free(ret[i]); |
||
44 | free(ret); |
||
45 | return NULL; |
||
46 | } |
||
47 | 182 | up20180642 | strcpy(ret[i], line_buf); |
48 | ret[i][sz-1] = '\0'; |
||
49 | } |
||
50 | fclose(f); f = NULL;
|
||
51 | return ret;
|
||
52 | } |