Back to index

courier  0.68.2
maildirsearch.c
Go to the documentation of this file.
00001 /*
00002 ** Copyright 2002-2010 Double Precision, Inc.
00003 ** See COPYING for distribution information.
00004 */
00005 
00006 #include "config.h"
00007 #include "maildirsearch.h"
00008 
00009 
00010 int maildir_search_start_unicode(struct maildir_searchengine *sei,
00011                              const unicode_char *s)
00012 {
00013        unsigned i, j, *r;
00014 
00015        size_t n;
00016 
00017        for (n=0; s[n]; ++n)
00018               ;
00019        ++n;
00020 
00021        if (sei->string)
00022               free(sei->string);
00023 
00024        sei->string=malloc(n * sizeof(*s));
00025        if (!sei->string)
00026               return (-1);
00027        sei->string_l=n-1;
00028 
00029        memcpy(sei->string, s, n * sizeof(*s));
00030 
00031        if (sei->r)
00032               free(sei->r);
00033 
00034        sei->i=0;
00035        if ((sei->r=r=(unsigned *)malloc(sizeof(unsigned)*n)) == 0)
00036               return (-1);
00037 
00038        for (i=0; s[i]; i++)
00039               r[i]=0;
00040 
00041        for (i=0; s[i]; i++)
00042               for (j=0; s[i+j]; j++)
00043                      if (s[j] != s[i+j])
00044                      {
00045                             if (r[i+j] < j)
00046                                    r[i+j]=j;
00047                             break;
00048                      }
00049 
00050        maildir_search_reset(sei);
00051        return (0);
00052 }
00053 
00054 int maildir_search_start_str(struct maildir_searchengine *sei,
00055                           const char *s)
00056 {
00057        unicode_char *uc=malloc((strlen(s)+1) * sizeof(unicode_char));
00058        size_t n;
00059        int rc;
00060 
00061        if (!uc)
00062               return -1;
00063 
00064        for (n=0; (uc[n]=(unsigned char)s[n]) != 0; ++n)
00065               ;
00066 
00067        rc=maildir_search_start_unicode(sei, uc);
00068        free(uc);
00069        return rc;
00070 }
00071 
00072 int maildir_search_start_str_chset(struct maildir_searchengine *engine,
00073                                const char *string,
00074                                const char *chset)
00075 {
00076 #define SPC(s) ((s) == ' '|| (s) == '\t' || (s) == '\r' || (s) == '\n')
00077 
00078        unicode_char *ucptr;
00079        size_t ucsize;
00080        libmail_u_convert_handle_t h=libmail_u_convert_tou_init(chset, &ucptr,
00081                                                         &ucsize, 1);
00082        size_t i, j;
00083        int rc;
00084 
00085        if (h == NULL)
00086               return -1;
00087 
00088        if (libmail_u_convert(h, string, strlen(string)))
00089        {
00090               libmail_u_convert_deinit(h, NULL);
00091               return -1;
00092        }
00093 
00094        if (libmail_u_convert_deinit(h, NULL))
00095               return -1;
00096 
00097        for (i=j=0; ucptr[i]; )
00098        {
00099               while (SPC(ucptr[i]))
00100                      ++i;
00101 
00102               if (!ucptr[i])
00103                      break;
00104 
00105               while (ucptr[i])
00106               {
00107                      ucptr[j]=unicode_lc(ucptr[i]);
00108                      ++j;
00109                      if (SPC(ucptr[i]))
00110                             break;
00111 
00112                      ++i;
00113               }
00114        }
00115 
00116        while (j > 0 && SPC(ucptr[j-1]))
00117               --j;
00118        ucptr[j]=0;
00119 
00120        rc=maildir_search_start_unicode(engine, ucptr);
00121        free(ucptr);
00122        return rc;
00123 }