Initial revision 6759
[qball-mpd.git] / src / buffer2array.c
blobd7bfc4561592697ae1889ac832e1e943a4cf14bd
1 /* the Music Player Daemon (MPD)
2 * Copyright (C) 2003-2007 by Warren Dukes (warren.dukes@gmail.com)
3 * This project's homepage is: http://www.musicpd.org
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 #include "buffer2array.h"
21 #include <stdio.h>
22 #include <stdlib.h>
23 #include <string.h>
24 #include <ctype.h>
27 static inline
28 int
29 isWhiteSpace(char c)
31 return (c == ' ' || c == '\t');
34 int buffer2array(char *buffer, char *array[], const int max)
36 int i = 0;
37 char *c = buffer;
39 while (*c != '\0' && i < max) {
40 if (*c == '\"') {
41 array[i++] = ++c;
42 while (*c != '\0') {
43 if (*c == '\"') {
44 *(c++) = '\0';
45 break;
47 else if (*(c++) == '\\' && *c != '\0') {
48 memmove(c - 1, c, strlen(c) + 1);
51 } else {
52 while (isWhiteSpace(*c))
53 ++c;
54 array[i++] = c++;
55 if (*c == '\0')
56 return i;
57 while (!isWhiteSpace(*c) && *c != '\0')
58 ++c;
60 if (*c == '\0')
61 return i;
62 *(c++) = '\0';
63 while (isWhiteSpace(*c))
64 ++c;
66 return i;
69 #ifdef UNIT_TEST
71 #include <stdio.h>
72 #include <string.h>
73 #include <assert.h>
75 int main()
77 char *a[4] = { NULL };
78 char *b;
79 int max;
81 b = strdup("lsinfo \"/some/dir/name \\\"test\\\"\"");
82 max = buffer2array(b, a, 4);
83 assert( !strcmp("lsinfo", a[0]) );
84 assert( !strcmp("/some/dir/name \"test\"", a[1]) );
85 assert( !a[2] );
87 b = strdup("lsinfo \"/some/dir/name \\\"test\\\" something else\"");
88 max = buffer2array(b, a, 4);
89 assert( !strcmp("lsinfo", a[0]) );
90 assert( !strcmp("/some/dir/name \"test\" something else", a[1]) );
91 assert( !a[2] );
93 b = strdup("lsinfo \"/some/dir\\\\name\"");
94 max = buffer2array(b, a, 4);
95 assert( !strcmp("lsinfo", a[0]) );
96 assert( !strcmp("/some/dir\\name", a[1]) );
97 assert( !a[2] );
99 b = strdup("lsinfo \"/some/dir name\"");
100 max = buffer2array(b, a, 4);
101 assert( !strcmp("lsinfo", a[0]) );
102 assert( !strcmp("/some/dir name", a[1]) );
103 assert( !a[2] );
105 b = strdup("lsinfo \"\\\"/some/dir\\\"\"");
106 max = buffer2array(b, a, 4);
107 assert( !strcmp("lsinfo", a[0]) );
108 assert( !strcmp("\"/some/dir\"", a[1]) );
109 assert( !a[2] );
111 b = strdup("lsinfo \"\\\"/some/dir\\\" x\"");
112 max = buffer2array(b, a, 4);
113 assert( !strcmp("lsinfo", a[0]) );
114 assert( !strcmp("\"/some/dir\" x", a[1]) );
115 assert( !a[2] );
117 b = strdup("lsinfo \"single quote\\'d from php magicquotes\"");
118 max = buffer2array(b, a, 4);
119 assert( !strcmp("lsinfo", a[0]) );
120 assert( !strcmp("single quote\'d from php magicquotes", a[1]) );
121 assert( !a[2] );
123 b = strdup("lsinfo \"double quote\\\"d from php magicquotes\"");
124 max = buffer2array(b, a, 4);
125 assert( !strcmp("lsinfo", a[0]) );
126 assert( !strcmp("double quote\"d from php magicquotes", a[1]) );
127 assert( !a[2] );
129 return 0;
132 #endif