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

Last change on this file since 1138 was 1138, checked in by Bruno Cornec, 17 years ago

mr_getline should test for feof as getline returns also -1 in that case.

  • 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 {
[1133]37 mr_msg_int(1,line,file,"Attempt to reference NULL pointer\nExiting...");
[1104]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) {
[1133]49 mr_msg_int(1,line,file,"Unable to alloc memory in mr_malloc\nExiting...");
[1104]50 mr_exit(-1,"Unable to alloc memory in mr_malloc");
[1054]51 }
52 return(ret);
53}
54
55/* encapsulation function for getline */
[1138]56void mr_getline_int(char **lineptr, size_t *n, FILE *fd, int line, const char *file) {
[1054]57
58 ssize_t ret;
59
[1138]60 ret = getline(lineptr,n,fd);
61 if ((ret == -1) && (! feof(fd))) {
[1133]62 mr_msg_int(1,line,file,"Unable to alloc memory in mr_getline\nExiting...");
[1104]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) {
[1133]76 mr_msg_int(1,line,file,"Unable to alloc memory in mr_asprintf\nExiting...");
[1104]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.