Project

General

Profile

Statistics
| Revision:

root / proj / libs / utils / src / xpm_utils.c @ 325

History | View | Annotate | Download (1.44 KB)

1
#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
void xpm_save_as_xpm2(const char* const* p, const char *s){
12
    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
    size_t len = 1024; char *line_buf = malloc(len*sizeof(char));
25
    ssize_t sz;
26

    
27
    char **ret = NULL;
28

    
29
    unsigned 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
    ret[0] = malloc(((unsigned)sz+1)*sizeof(char)); if(ret[0] == NULL){ free(ret); return NULL; }
36
    strcpy(ret[0], line_buf);
37

    
38
    for(size_t i = 1; i < 1+num_colors+h; ++i){
39
        sz = getline(&line_buf, &len, f);
40
        ret[i] = malloc(((unsigned)sz+1)*sizeof(char));
41
        if(ret[i] == NULL){
42
            for(size_t j = 0; j < i; ++j)
43
                free(ret[i]);
44
            free(ret);
45
            return NULL;
46
        }
47
        strcpy(ret[i], line_buf);
48
        ret[i][sz-1] = '\0';
49
    }
50
    fclose(f); f = NULL;
51
    free(line_buf); line_buf = NULL;
52
    return ret;
53
}