summaryrefslogtreecommitdiff
path: root/portato/eix/eix_utils.pyx
blob: 57fa5d780ca4c7d9463f12d2aca96e9eec270302 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
class EndOfFileError (IOError):
    
    def __init__ (self, filename = None):
        self.message = "End of file reached while not expecting it"
        self.filename = filename

    def __str__ (self):
        if self.filename is not None:
            return "%s: %s" % (self.message, self.filename)
        else:
            return self.message

cdef char* strdup (char * other) except NULL:
    cdef size_t len
    cdef char* new

    if other is NULL:
        return NULL

    len = strlen(other)
    new = <char*>PyMem_Malloc(len+1)

    if new is NULL:
        raise MemoryError, "Malloc of new string copy"
        return NULL

    return strcpy(new, other)


cdef File* fopen (char* path, char* mode) except NULL:
    cdef File* f
    
    f = <File*> PyMem_Malloc(sizeof(File))
    
    if f is NULL:
        raise MemoryError, "Malloc of File"
        return NULL

    f.file = c_fopen(path, mode)

    if f.file is NULL:
        raise IOError, (errno, strerror(errno), path)
        return NULL

    f.name = strdup(path)

    if f.name is NULL:
        return NULL

    return f

cdef void fclose (File* f):
    c_fclose(f.file)
    ffree(f.name)
    PyMem_Free(f)

cdef void ffree (void* p):
    PyMem_Free(p)

cdef char* fget (File* f, size_t n) except NULL:
    cdef char* buf
    buf = <char*> PyMem_Malloc(n)

    if buf is NULL:
        raise MemoryError, "Malloc"
        return NULL

    if (fread(buf, 1, n, f.file) != n):
        PyMem_Free(buf)
        raise EndOfFileError, f.name

    return buf