flist/flist32_from_str.c

Go to the documentation of this file.
00001 // Copyright 2006 Benedikt Böhm <hollow@gentoo.org>
00002 //
00003 // This program is free software; you can redistribute it and/or modify
00004 // it under the terms of the GNU General Public License as published by
00005 // the Free Software Foundation; either version 2 of the License, or
00006 // (at your option) any later version.
00007 //
00008 // This program is distributed in the hope that it will be useful,
00009 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00010 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00011 // GNU General Public License for more details.
00012 //
00013 // You should have received a copy of the GNU General Public License
00014 // along with this program; if not, write to the
00015 // Free Software Foundation, Inc.,
00016 // 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
00017 
00018 #include <stdlib.h>
00019 #include <errno.h>
00020 
00021 #include "flist.h"
00022 #include "str.h"
00023 
00024 int flist32_from_str(const char *str, const flist32_t list[],
00025                   uint32_t *flags, uint32_t *mask,
00026                   char clmod, char delim)
00027 {
00028         char *p, *o, *buf;
00029         int clear = 0;
00030         uint32_t cur_flag;
00031         
00032         if (str_isempty(str))
00033                 return errno = EINVAL, -1;
00034         
00035         buf = p = o = str_dup(str);
00036         
00037         while (1) {
00038                 p = str_index(p, delim, str_len(p));
00039                 
00040                 while (char_isspace(*o))
00041                         o++;
00042                 
00043                 if (p) {
00044                         if (o == p) {
00045                                 p++;
00046                                 continue;
00047                         }
00048                         
00049                         *p++ = '\0';
00050                 }
00051                 
00052                 if (*o == clmod)
00053                         clear = 1;
00054                 
00055                 cur_flag = flist32_getval(list, o+clear);
00056                 
00057                 if (!cur_flag) {
00058                         free(buf);
00059                         return errno = ENOENT, -1;
00060                 }
00061                 
00062                 if (clear) {
00063                         *flags &= ~cur_flag;
00064                         *mask  |=  cur_flag;
00065                 } else {
00066                         *flags |=  cur_flag;
00067                         *mask  |=  cur_flag;
00068                 }
00069                 
00070                 if (!p)
00071                         break;
00072                 else
00073                         o = p;
00074         }
00075         
00076         free(buf);
00077         return 0;
00078 }

Generated on Sun Dec 3 17:45:53 2006 for lucid by  doxygen 1.5.1