1 /* $Source: /u/mark/src/pax/RCS/mem.c,v $ 2 * 3 * $Revision: 1.2 $ 4 * 5 * mem.c - memory allocation and manipulation functions 6 * 7 * DESCRIPTION 8 * 9 * These routines are provided for higher level handling of the UNIX 10 * memory allocation functions. 11 * 12 * AUTHOR 13 * 14 * Mark H. Colburn, NAPS International (mark@jhereg.mn.org) 15 * 16 * 17 * Sponsored by The USENIX Association for public distribution. 18 * 19 * Copyright (c) 1989 Mark H. Colburn. 20 * All rights reserved. 21 * 22 * Redistribution and use in source and binary forms are permitted 23 * provided that the above copyright notice is duplicated in all such 24 * forms and that any documentation, advertising materials, and other 25 * materials related to such distribution and use acknowledge that the 26 * software was developed * by Mark H. Colburn and sponsored by The 27 * USENIX Association. 28 * 29 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR 30 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED 31 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 32 * 33 * $Log: mem.c,v $ 34 * Revision 1.2 89/02/12 10:04:53 mark 35 * 1.2 release fixes 36 * 37 * Revision 1.1 88/12/23 18:02:17 mark 38 * Initial revision 39 * 40 */ 41 42 #ifndef lint 43 static char *ident = "$Id: mem.c,v 1.2 89/02/12 10:04:53 mark Exp $"; 44 static char *copyright = "Copyright (c) 1989 Mark H. Colburn.\nAll rights reserved.\n"; 45 #endif /* ! lint */ 46 47 48 /* Headers */ 49 50 #include "pax.h" 51 52 53 /* mem_get - allocate memory 54 * 55 * DESCRIPTION 56 * 57 * Mem_get attempts to allocate a block of memory using the malloc 58 * function call. In the event that the memory is not available, 59 * mem_get will display an "Out of memory" message for the user 60 * the first time it encounters the an out of memory situation. 61 * Subsequent calls to mem_get may fail, but no message will be 62 * printed. 63 * 64 * PARAMETERS 65 * 66 * uint len - The amount of memory to allocate 67 * 68 * RETURNS 69 * 70 * Normally returns the pointer to the newly allocated memory. If 71 * an error occurs, NULL is returned, and an error message is 72 * printed. 73 * 74 * ERRORS 75 * 76 * ENOMEM No memory is available 77 */ 78 79 #ifdef __STDC__ 80 81 char *mem_get(uint len) 82 83 #else 84 85 char *mem_get(len) 86 uint len; /* amount of memory to get */ 87 88 #endif 89 { 90 char *mem; 91 static short outofmem = 0; 92 93 if ((mem = (char *)malloc(len)) == (char *)NULL && !outofmem) { 94 outofmem++; 95 warn("mem_get()", "Out of memory"); 96 } 97 return (mem); 98 } 99 100 101 /* mem_str - duplicate a string into dynamic memory 102 * 103 * DESCRIPTION 104 * 105 * Mem_str attempts to make a copy of string. It allocates space for 106 * the string, and if the allocation was successfull, copies the old 107 * string into the newly allocated space. 108 * 109 * PARAMETERS 110 * 111 * char *str - string to make a copy of 112 * 113 * RETURNS 114 * 115 * Normally returns a pointer to a new string at least as large 116 * as strlen(str) + 1, which contains a copy of the the data 117 * passed in str, plus a null terminator. Returns (char *)NULL 118 * if enough memory to make a copy of str is not available. 119 */ 120 121 #ifdef __STDC__ 122 123 char *mem_str(char *str) 124 125 #else 126 127 char *mem_str(str) 128 char *str; /* string to make a copy of */ 129 130 #endif 131 { 132 char *mem; 133 134 if (mem = mem_get((uint) strlen(str) + 1)) { 135 strcpy(mem, str); 136 } 137 return (mem); 138 } 139