Annotation of embedaddon/php/ext/mbstring/libmbfl/mbfl/mbfl_memory_device.c, revision 1.1.1.2

1.1       misho       1: /*
                      2:  * "streamable kanji code filter and converter"
                      3:  * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
                      4:  *
                      5:  * LICENSE NOTICES
                      6:  *
                      7:  * This file is part of "streamable kanji code filter and converter",
                      8:  * which is distributed under the terms of GNU Lesser General Public 
                      9:  * License (version 2) as published by the Free Software Foundation.
                     10:  *
                     11:  * This software is distributed in the hope that it will be useful,
                     12:  * but WITHOUT ANY WARRANTY; without even the implied warranty of
                     13:  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     14:  * GNU Lesser General Public License for more details.
                     15:  *
                     16:  * You should have received a copy of the GNU Lesser General Public
                     17:  * License along with "streamable kanji code filter and converter";
                     18:  * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
                     19:  * Suite 330, Boston, MA  02111-1307  USA
                     20:  *
                     21:  * The author of this file:
                     22:  *
                     23:  */
                     24: /*
                     25:  * The source code included in this files was separated from mbfilter.c
                     26:  * by Moriyoshi Koizumi <moriyoshi@php.net> on 20 Dec 2002. The file
                     27:  * mbfilter.c is included in this package .
                     28:  *
                     29:  */
                     30: 
                     31: #ifdef HAVE_CONFIG_H
                     32: #include "config.h"
                     33: #endif
                     34: 
                     35: #ifdef HAVE_STDDEF_H
                     36: #include <stddef.h>
                     37: #endif
                     38: 
                     39: #include "mbfl_allocators.h"
                     40: #include "mbfl_string.h"
                     41: #include "mbfl_memory_device.h"
                     42: 
                     43: /*
                     44:  * memory device output functions
                     45:  */
                     46: void
                     47: mbfl_memory_device_init(mbfl_memory_device *device, int initsz, int allocsz)
                     48: {
                     49:        if (device) {
                     50:                device->length = 0;
                     51:                device->buffer = (unsigned char *)0;
                     52:                if (initsz > 0) {
                     53:                        device->buffer = (unsigned char *)mbfl_malloc(initsz*sizeof(unsigned char));
                     54:                        if (device->buffer != NULL) {
                     55:                                device->length = initsz;
                     56:                        }
                     57:                }
                     58:                device->pos= 0;
                     59:                if (allocsz > MBFL_MEMORY_DEVICE_ALLOC_SIZE) {
                     60:                        device->allocsz = allocsz;
                     61:                } else {
                     62:                        device->allocsz = MBFL_MEMORY_DEVICE_ALLOC_SIZE;
                     63:                }
                     64:        }
                     65: }
                     66: 
                     67: void
                     68: mbfl_memory_device_realloc(mbfl_memory_device *device, int initsz, int allocsz)
                     69: {
                     70:        unsigned char *tmp;
                     71: 
                     72:        if (device) {
                     73:                if (initsz > device->length) {
                     74:                        tmp = (unsigned char *)mbfl_realloc((void *)device->buffer, initsz*sizeof(unsigned char));
                     75:                        if (tmp != NULL) {
                     76:                                device->buffer = tmp;
                     77:                                device->length = initsz;
                     78:                        }
                     79:                }
                     80:                if (allocsz > MBFL_MEMORY_DEVICE_ALLOC_SIZE) {
                     81:                        device->allocsz = allocsz;
                     82:                } else {
                     83:                        device->allocsz = MBFL_MEMORY_DEVICE_ALLOC_SIZE;
                     84:                }
                     85:        }
                     86: }
                     87: 
                     88: void
                     89: mbfl_memory_device_clear(mbfl_memory_device *device)
                     90: {
                     91:        if (device) {
                     92:                if (device->buffer) {
                     93:                        mbfl_free(device->buffer);
                     94:                }
                     95:                device->buffer = (unsigned char *)0;
                     96:                device->length = 0;
                     97:                device->pos = 0;
                     98:        }
                     99: }
                    100: 
                    101: void
                    102: mbfl_memory_device_reset(mbfl_memory_device *device)
                    103: {
                    104:        if (device) {
                    105:                device->pos = 0;
                    106:        }
                    107: }
                    108: 
                    109: void
                    110: mbfl_memory_device_unput(mbfl_memory_device *device)
                    111: {
                    112:        if (device->pos > 0) {
                    113:                device->pos--;
                    114:        }
                    115: }
                    116: 
                    117: mbfl_string *
                    118: mbfl_memory_device_result(mbfl_memory_device *device, mbfl_string *result)
                    119: {
                    120:        if (device && result) {
                    121:                result->len = device->pos;
                    122:                mbfl_memory_device_output4('\0', device);
                    123:                result->val = device->buffer;
                    124:                device->buffer = (unsigned char *)0;
                    125:                device->length = 0;
                    126:                device->pos= 0;
                    127:                if (result->val == NULL) {
                    128:                        result->len = 0;
                    129:                        result = NULL;
                    130:                }
                    131:        } else {
                    132:                result = NULL;
                    133:        }
                    134: 
                    135:        return result;
                    136: }
                    137: 
                    138: int
                    139: mbfl_memory_device_output(int c, void *data)
                    140: {
                    141:        mbfl_memory_device *device = (mbfl_memory_device *)data;
                    142: 
                    143:        if (device->pos >= device->length) {
                    144:                /* reallocate buffer */
                    145:                int newlen;
                    146:                unsigned char *tmp;
                    147: 
                    148:                newlen = device->length + device->allocsz;
                    149:                tmp = (unsigned char *)mbfl_realloc((void *)device->buffer, newlen*sizeof(unsigned char));
                    150:                if (tmp == NULL) {
                    151:                        return -1;
                    152:                }
                    153:                device->length = newlen;
                    154:                device->buffer = tmp;
                    155:        }
                    156: 
                    157:        device->buffer[device->pos++] = (unsigned char)c;
                    158:        return c;
                    159: }
                    160: 
                    161: int
                    162: mbfl_memory_device_output2(int c, void *data)
                    163: {
                    164:        mbfl_memory_device *device = (mbfl_memory_device *)data;
                    165: 
                    166:        if ((device->pos + 2) >= device->length) {
                    167:                /* reallocate buffer */
                    168:                int newlen;
                    169:                unsigned char *tmp;
                    170: 
                    171:                newlen = device->length + device->allocsz;
                    172:                tmp = (unsigned char *)mbfl_realloc((void *)device->buffer, newlen*sizeof(unsigned char));
                    173:                if (tmp == NULL) {
                    174:                        return -1;
                    175:                }
                    176:                device->length = newlen;
                    177:                device->buffer = tmp;
                    178:        }
                    179: 
                    180:        device->buffer[device->pos++] = (unsigned char)((c >> 8) & 0xff);
                    181:        device->buffer[device->pos++] = (unsigned char)(c & 0xff);
                    182: 
                    183:        return c;
                    184: }
                    185: 
                    186: int
                    187: mbfl_memory_device_output4(int c, void* data)
                    188: {
                    189:        mbfl_memory_device *device = (mbfl_memory_device *)data;
                    190: 
                    191:        if ((device->pos + 4) >= device->length) {
                    192:                /* reallocate buffer */
                    193:                int newlen;
                    194:                unsigned char *tmp;
                    195: 
                    196:                newlen = device->length + device->allocsz;
                    197:                tmp = (unsigned char *)mbfl_realloc((void *)device->buffer, newlen*sizeof(unsigned char));
                    198:                if (tmp == NULL) {
                    199:                        return -1;
                    200:                }
                    201:                device->length = newlen;
                    202:                device->buffer = tmp;
                    203:        }
                    204: 
                    205:        device->buffer[device->pos++] = (unsigned char)((c >> 24) & 0xff);
                    206:        device->buffer[device->pos++] = (unsigned char)((c >> 16) & 0xff);
                    207:        device->buffer[device->pos++] = (unsigned char)((c >> 8) & 0xff);
                    208:        device->buffer[device->pos++] = (unsigned char)(c & 0xff);
                    209: 
                    210:        return c;
                    211: }
                    212: 
                    213: int
                    214: mbfl_memory_device_strcat(mbfl_memory_device *device, const char *psrc)
                    215: {
                    216:        int len;
                    217:        unsigned char *w;
                    218:        const unsigned char *p;
                    219: 
                    220:        len = 0;
1.1.1.2 ! misho     221:        p = (const unsigned char*)psrc;
1.1       misho     222:        while (*p) {
                    223:                p++;
                    224:                len++;
                    225:        }
                    226: 
                    227:        if ((device->pos + len) >= device->length) {
                    228:                /* reallocate buffer */
                    229:                int newlen = device->length + (len + MBFL_MEMORY_DEVICE_ALLOC_SIZE)*sizeof(unsigned char);
                    230:                unsigned char *tmp = (unsigned char *)mbfl_realloc((void *)device->buffer, newlen*sizeof(unsigned char));
                    231:                if (tmp == NULL) {
                    232:                        return -1;
                    233:                }
                    234:                device->length = newlen;
                    235:                device->buffer = tmp;
                    236:        }
                    237: 
1.1.1.2 ! misho     238:        p = (const unsigned char*)psrc;
1.1       misho     239:        w = &device->buffer[device->pos];
                    240:        device->pos += len;
                    241:        while (len > 0) {
                    242:                *w++ = *p++;
                    243:                len--;
                    244:        }
                    245: 
                    246:        return len;
                    247: }
                    248: 
                    249: int
                    250: mbfl_memory_device_strncat(mbfl_memory_device *device, const char *psrc, int len)
                    251: {
                    252:        unsigned char *w;
                    253: 
                    254:        if ((device->pos + len) >= device->length) {
                    255:                /* reallocate buffer */
                    256:                int newlen = device->length + len + MBFL_MEMORY_DEVICE_ALLOC_SIZE;
                    257:                unsigned char *tmp = (unsigned char *)mbfl_realloc((void *)device->buffer, newlen*sizeof(unsigned char));
                    258:                if (tmp == NULL) {
                    259:                        return -1;
                    260:                }
                    261:                device->length = newlen;
                    262:                device->buffer = tmp;
                    263:        }
                    264: 
                    265:        w = &device->buffer[device->pos];
                    266:        device->pos += len;
                    267:        while (len > 0) {
                    268:                *w++ = *psrc++;
                    269:                len--;
                    270:        }
                    271: 
                    272:        return len;
                    273: }
                    274: 
                    275: int
                    276: mbfl_memory_device_devcat(mbfl_memory_device *dest, mbfl_memory_device *src)
                    277: {
                    278:        int n;
                    279:        unsigned char *p, *w;
                    280: 
                    281:        if ((dest->pos + src->pos) >= dest->length) {
                    282:                /* reallocate buffer */
                    283:                int newlen = dest->length + src->pos + MBFL_MEMORY_DEVICE_ALLOC_SIZE;
                    284:                unsigned char *tmp = (unsigned char *)mbfl_realloc((void *)dest->buffer, newlen*sizeof(unsigned char));
                    285:                if (tmp == NULL) {
                    286:                        return -1;
                    287:                }
                    288:                dest->length = newlen;
                    289:                dest->buffer = tmp;
                    290:        }
                    291: 
                    292:        p = src->buffer;
                    293:        w = &dest->buffer[dest->pos];
                    294:        n = src->pos;
                    295:        dest->pos += n;
                    296:        while (n > 0) {
                    297:                *w++ = *p++;
                    298:                n--;
                    299:        }
                    300: 
                    301:        return n;
                    302: }
                    303: 
                    304: void
                    305: mbfl_wchar_device_init(mbfl_wchar_device *device)
                    306: {
                    307:        if (device) {
                    308:                device->buffer = (unsigned int *)0;
                    309:                device->length = 0;
                    310:                device->pos= 0;
                    311:                device->allocsz = MBFL_MEMORY_DEVICE_ALLOC_SIZE;
                    312:        }
                    313: }
                    314: 
                    315: void
                    316: mbfl_wchar_device_clear(mbfl_wchar_device *device)
                    317: {
                    318:        if (device) {
                    319:                if (device->buffer) {
                    320:                        mbfl_free(device->buffer);
                    321:                }
                    322:                device->buffer = (unsigned int*)0;
                    323:                device->length = 0;
                    324:                device->pos = 0;
                    325:        }
                    326: }
                    327: 
                    328: int
                    329: mbfl_wchar_device_output(int c, void *data)
                    330: {
                    331:        mbfl_wchar_device *device = (mbfl_wchar_device *)data;
                    332: 
                    333:        if (device->pos >= device->length) {
                    334:                /* reallocate buffer */
                    335:                int newlen;
                    336:                unsigned int *tmp;
                    337: 
                    338:                newlen = device->length + device->allocsz;
                    339:                tmp = (unsigned int *)mbfl_realloc((void *)device->buffer, newlen*sizeof(int));
                    340:                if (tmp == NULL) {
                    341:                        return -1;
                    342:                }
                    343:                device->length = newlen;
                    344:                device->buffer = tmp;
                    345:        }
                    346: 
                    347:        device->buffer[device->pos++] = c;
                    348: 
                    349:        return c;
                    350: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>