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