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

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;
        !           221:        p = psrc;
        !           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: 
        !           238:        p = psrc;
        !           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>