source: branches/stable/mondo/src/lib/mr_mem.c @ 1104

Last change on this file since 1104 was 1104, checked in by bruno, 12 years ago

Improvement of the low level library (Usage of LINE and FILE and simplified interfaces using macros)

  • Property svn:eol-style set to native
File size: 2.1 KB
RevLine 
[1054]1/*
2 * $Id$
3 *
4 * Code (c)2006 Bruno Cornec <bruno@mondorescue.org>
5 *
6 *     Main file of mr_mem : a very small and simple
7 *     library for memory management
8 *
9 * Provided under the GPLv2
10 */
11
[1064]12#ifndef _GNU_SOURCE
13#define _GNU_SOURCE
14#endif
15
[1054]16#include <stdio.h>
17#include <stdlib.h>
18
19#include "mr_err.h"
20#include "mr_msg.h"
21
22/*
23 * Function that frees memory if necessary
[1104]24 * A pointer to the memory pointed is passed to it.
25 * *allocated variable points then to the original content
26 * pointed to by the caller
[1054]27 */
[1104]28void mr_free_int(void **allocated, int line, const char *file) {
[1054]29
30    /* free man pages says that if allocated is NULL
31     * nothing happens
32     */
[1104]33    if (*allocated != NULL) {
34        free(*allocated);
35        *allocated = NULL;
36    } else {
37        mr_msg_int(0,line,file,"Attempt to reference NULL pointer\nExiting...");
38        mr_exit(-1,"Attempt to reference NULL pointer");
39    }
[1054]40}
41
42/* encapsulation function for malloc */
[1104]43void *mr_malloc_int(size_t size, int line, const char *file) {
[1054]44   
45    void *ret;
46
47    ret = malloc(size);
48    if (ret == NULL) {
[1104]49        mr_msg_int(0,line,file,"Unable to alloc memory in mr_malloc\nExiting...");
50        mr_exit(-1,"Unable to alloc memory in mr_malloc");
[1054]51    }
52    return(ret);
53}
54
55/* encapsulation function for getline */
[1104]56void mr_getline_int(char **lineptr, size_t *n, FILE *stream, int line, const char *file) {
[1054]57   
58    ssize_t ret;
59
60    ret = getline(lineptr,n,stream);
61    if (ret == -1) {
[1104]62        mr_msg_int(0,line,file,"Unable to alloc memory in mr_getline\nExiting...",line,file);
63        mr_exit(-1,"Unable to alloc memory in mr_getline");
[1054]64    }
65}
66
67/* encapsulation function for asprintf */
[1104]68void mr_asprintf_int(char **strp, int line, const char *file, const char *fmt, ...) {
[1054]69
70    int res = 0;
[1064]71    va_list args;
[1054]72
[1064]73    va_start(args,fmt);
[1054]74    res = vasprintf(strp, fmt, args);
75    if (res == -1) {
[1104]76        mr_msg_int(0,line,file,"Unable to alloc memory in mr_asprintf\nExiting...",line,file);
77        mr_exit(-1,"Unable to alloc memory in mr_asprintf");
[1054]78    }
[1064]79    va_end(args);
[1054]80}
81
82/*
83 * Function that properly allocates a string from another one
84 * freeing it before in any case
85 */
[1104]86void mr_allocstr_int(char *alloc, const char *orig, int line, const char *file) {
[1054]87
[1104]88    mr_free_int((void **)&alloc, line, file); 
89    mr_asprintf_int(&alloc, line, file, orig);
[1054]90}
Note: See TracBrowser for help on using the repository browser.