The R Project SVN R

Rev

Rev 42521 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 42521 Rev 45017
Line 46... Line 46...
46
 
46
 
47
#define TRACEAR(a)
47
#define TRACEAR(a)
48
 
48
 
49
char * memalloc(long size)
49
char * memalloc(long size)
50
{
50
{
51
	long *block;
51
    long *block;
52
	char *a;
52
    char *a;
53
	long i, datasize;
53
    long i, datasize;
54
        TRACEAR("alloc");
54
    TRACEAR("alloc");
55
	datasize = (((size + 4) >> 2) << 2);
55
    datasize = (((size + 4) >> 2) << 2);
56
	#ifdef COMPILER
56
#ifdef COMPILER
57
	  #if (COMPILER <= 16)
57
#if (COMPILER <= 16)
58
		if ((sizeof(long)+datasize) >= (1<<16))
58
    if ((sizeof(long)+datasize) >= (1<<16))
59
			return NULL;
59
	return NULL;
60
	  #endif
60
#endif
61
	#endif
61
#endif
62
	block = (long *) malloc(sizeof(long) + datasize);
62
    block = (long *) malloc(sizeof(long) + datasize);
63
	if (block == NULL)
63
    if (block == NULL)
64
		return NULL;
64
	return NULL;
65
	block[0] = size;
65
    block[0] = size;
66
	a = (char *) & block[1];
66
    a = (char *) & block[1];
67
	for (i=0; i<datasize; i++)
67
    for (i=0; i<datasize; i++)
68
		a[i] = '\0';
68
	a[i] = '\0';
69
	return a;
69
    return a;
70
}
70
}
71
 
71
 
72
char * memrealloc(char *a, long new_size)
72
char * memrealloc(char *a, long new_size)
73
{
73
{
74
	long *block;
74
    long *block;
75
	long i, size, oldsize, newsize;
75
    long i, size, oldsize, newsize;
76
        TRACEAR("realloc");
76
    TRACEAR("realloc");
77
	if (new_size <= 0) {
77
    if (new_size <= 0) {
78
		memfree(a);
78
	memfree(a);
79
		return NULL;
79
	return NULL;
80
	}
80
    }
81
 
81
 
82
	if (a == NULL) {
82
    if (a == NULL) {
83
		block = NULL;
83
	block = NULL;
84
		size = 0;
84
	size = 0;
85
	}
85
    }
86
	else {
86
    else {
87
		block = ((long*)a) - 1;
87
	block = ((long*)a) - 1;
88
		size = block[0];
88
	size = block[0];
89
	}
89
    }
90
 
90
 
91
	oldsize = size ? (((size + 4) >> 2) << 2) : 0;
91
    oldsize = size ? (((size + 4) >> 2) << 2) : 0;
92
	newsize = (((new_size + 4) >> 2) << 2);
92
    newsize = (((new_size + 4) >> 2) << 2);
93
 
93
 
94
	if ( newsize != oldsize ) {
94
    if ( newsize != oldsize ) {
95
		#ifdef COMPILER
95
#ifdef COMPILER
96
		  #if (COMPILER <= 16)
96
#if (COMPILER <= 16)
97
			if ((sizeof(long)+newsize) >= (1<<16))
97
	if ((sizeof(long)+newsize) >= (1<<16))
98
				return NULL;
98
	    return NULL;
99
		  #endif
99
#endif
100
		#endif
100
#endif
101
		block = (long *) realloc(block, sizeof(long) + newsize);
101
	block = (long *) realloc(block, sizeof(long) + newsize);
102
		if (block == NULL)
102
	if (block == NULL)
103
			return NULL;
103
	    return NULL;
104
		a = (char *) & block[1];
104
	a = (char *) & block[1];
105
		for (i=oldsize; i<newsize; i++)
105
	for (i=oldsize; i<newsize; i++)
106
			a[i] = '\0';
106
	    a[i] = '\0';
107
	}
107
    }
108
 
108
 
109
	block[0] = new_size;
109
    block[0] = new_size;
110
	return a;
110
    return a;
111
}
111
}
112
 
112
 
113
long memlength(char *a)
113
long memlength(char *a)
114
{
114
{
115
	return (a) ? ((long*)(a)-1)[0] : 0;
115
    return (a) ? ((long*)(a)-1)[0] : 0;
116
}
116
}
117
 
117
 
118
void memfree(char *a)
118
void memfree(char *a)
119
{
119
{
120
	if (a) free((long*)(a)-1);
120
    if (a) free((long*)(a)-1);
121
}
121
}
122
 
122
 
123
char * memexpand(char *a, long extra)
123
char * memexpand(char *a, long extra)
124
{
124
{
125
	long *block;
125
    long *block;
126
	long i, size, oldsize, newsize;
126
    long i, size, oldsize, newsize;
127
        TRACEAR("exp");
127
    TRACEAR("exp");
128
	if (extra == 0)
128
    if (extra == 0)
129
		return a;
-
 
130
 
-
 
131
	if (a == NULL) {
-
 
132
		block = NULL;
-
 
133
		size = 0;
-
 
134
	}
-
 
135
	else {
-
 
136
		block = ((long*)a) - 1;
-
 
137
		size = block[0];
-
 
138
	}
-
 
139
 
-
 
140
	oldsize = size ? (((size + 4) >> 2) << 2) : 0;
-
 
141
	newsize = (((size + extra + 4) >> 2) << 2);
-
 
142
 
-
 
143
	if ( newsize != oldsize ) {
-
 
144
		#ifdef COMPILER
-
 
145
		  #if (COMPILER <= 16)
-
 
146
			if ((sizeof(long)+newsize) >= (1<<16))
-
 
147
				return NULL;
-
 
148
		  #endif
-
 
149
		#endif
-
 
150
		block = (long *) realloc(block, sizeof(long) + newsize);
-
 
151
		if (block == NULL)
-
 
152
			return NULL;
-
 
153
		a = (char *) & block[1];
-
 
154
		for (i=oldsize; i<newsize; i++)
-
 
155
			a[i] = '\0';
-
 
156
	}
-
 
157
 
-
 
158
	block[0] = size + extra;
-
 
159
	return a;
129
	return a;
-
 
130
 
-
 
131
    if (a == NULL) {
-
 
132
	block = NULL;
-
 
133
	size = 0;
-
 
134
    }
-
 
135
    else {
-
 
136
	block = ((long*)a) - 1;
-
 
137
	size = block[0];
-
 
138
    }
-
 
139
 
-
 
140
    oldsize = size ? (((size + 4) >> 2) << 2) : 0;
-
 
141
    newsize = (((size + extra + 4) >> 2) << 2);
-
 
142
 
-
 
143
    if ( newsize != oldsize ) {
-
 
144
#ifdef COMPILER
-
 
145
#if (COMPILER <= 16)
-
 
146
	if ((sizeof(long)+newsize) >= (1<<16))
-
 
147
	    return NULL;
-
 
148
#endif
-
 
149
#endif
-
 
150
	block = (long *) realloc(block, sizeof(long) + newsize);
-
 
151
	if (block == NULL)
-
 
152
	    return NULL;
-
 
153
	a = (char *) & block[1];
-
 
154
	for (i=oldsize; i<newsize; i++)
-
 
155
	    a[i] = '\0';
-
 
156
    }
-
 
157
 
-
 
158
    block[0] = size + extra;
-
 
159
    return a;
160
}
160
}
161
 
161
 
162
char * memjoin(char *a, char *b)
162
char * memjoin(char *a, char *b)
163
{
163
{
164
	long i, size, extra;
164
    long i, size, extra;
165
 
165
 
166
	size = memlength(a);
166
    size = memlength(a);
167
	extra = memlength(b);
167
    extra = memlength(b);
168
	a = memexpand(a, extra);
168
    a = memexpand(a, extra);
169
	if (a) {
169
    if (a) {
170
		for (i=0; i<extra; i++)
170
	for (i=0; i<extra; i++)
171
			a[i+size] = b[i];
171
	    a[i+size] = b[i];
172
	}
172
    }
173
	return a;
173
    return a;
174
}
174
}
175
 
-
 
176
 
-
 
177
 
-