Back to index

courier  0.68.2
unicodebuf.c
Go to the documentation of this file.
00001 /*
00002 ** Copyright 2011 Double Precision, Inc.
00003 ** See COPYING for distribution information.
00004 **
00005 */
00006 
00007 #include      "unicode_config.h"
00008 #include      "unicode.h"
00009 #include      <stdlib.h>
00010 #include      <string.h>
00011 
00012 void unicode_buf_init(struct unicode_buf *p, size_t max)
00013 {
00014        p->ptr=0;
00015        p->size=0;
00016        p->len=0;
00017        p->max=max;
00018 }
00019 
00020 void unicode_buf_deinit(struct unicode_buf *p)
00021 {
00022        if (p->ptr)
00023               free(p->ptr);
00024 }
00025 
00026 int unicode_buf_append(struct unicode_buf *p,
00027                      const unicode_char *uc, size_t l)
00028 {
00029        if (l > p->max-p->len)
00030               l=p->max-p->len;
00031 
00032        if (p->len + l > p->size)
00033        {
00034               size_t n=(p->len + l) * 2;
00035               unicode_char *newp;
00036 
00037               if (n < 256)
00038                      n=256;
00039 
00040               if (n > p->max)
00041                      n=p->max;
00042 
00043               newp=p->ptr ? realloc(p->ptr, n * sizeof(unicode_char))
00044                      : malloc(n * sizeof(unicode_char));
00045 
00046               if (!newp)
00047                      return -1;
00048 
00049               p->ptr=newp;
00050               p->size=n;
00051        }
00052 
00053        memcpy(p->ptr + p->len, uc, l * sizeof(unicode_char));
00054 
00055        p->len += l;
00056        return 0;
00057 }
00058 
00059 void unicode_buf_append_char(struct unicode_buf *dst,
00060                           const char *str,
00061                           size_t cnt)
00062 {
00063        unicode_char unicode_buf[256];
00064 
00065        while (cnt)
00066        {
00067               size_t n=sizeof(unicode_buf)/sizeof(unicode_buf[0]), i;
00068 
00069               if (n > cnt)
00070                      n=cnt;
00071 
00072               for (i=0; i<n; ++i)
00073                      unicode_buf[i]=(unsigned char)str[i];
00074 
00075               str += n;
00076               cnt -= n;
00077               unicode_buf_append(dst, unicode_buf, i);
00078        }
00079 }
00080 
00081 void unicode_buf_remove(struct unicode_buf *p,
00082                      size_t pos,
00083                      size_t cnt)
00084 {
00085        if (pos > p->len)
00086               pos=p->len;
00087 
00088        if (cnt > p->len-pos)
00089               cnt=p->len-pos;
00090 
00091        if (cnt)
00092               memmove(p->ptr+pos+cnt, p->ptr+pos, p->len-pos-cnt);
00093        p->len -= cnt;
00094 }
00095 
00096 int unicode_buf_cmp(const struct unicode_buf *a,
00097                   const struct unicode_buf *b)
00098 {
00099        size_t i;
00100 
00101        for (i=0; i<a->len && i<b->len; i++)
00102        {
00103               if (a->ptr[i] < b->ptr[i])
00104                      return -1;
00105               if (a->ptr[i] > b->ptr[i])
00106                      return 1;
00107        }
00108 
00109        return (a->len < b->len ? -1:a->len > b->len ? 1:0);
00110 }
00111 
00112 int unicode_buf_cmp_str(const struct unicode_buf *p, const char *c,
00113                      size_t cl)
00114 {
00115        size_t i;
00116 
00117        for (i=0; i<p->len && i < cl; ++i)
00118        {
00119               if (p->ptr[i] < c[i])
00120                      return -1;
00121 
00122               if (p->ptr[i] > c[i])
00123                      return 1;
00124        }
00125 
00126        return (p->len < cl ? -1: p->len > cl ? 1:0);
00127 }