1/*** 2 This file is part of PulseAudio. 3 4 Copyright 2004-2006 Lennart Poettering 5 6 PulseAudio is free software; you can redistribute it and/or modify 7 it under the terms of the GNU Lesser General Public License as published 8 by the Free Software Foundation; either version 2.1 of the License, 9 or (at your option) any later version. 10 11 PulseAudio is distributed in the hope that it will be useful, but 12 WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 General Public License for more details. 15 16 You should have received a copy of the GNU Lesser General Public License 17 along with PulseAudio; if not, see <http://www.gnu.org/licenses/>. 18***/ 19 20#ifdef HAVE_CONFIG_H 21#include <config.h> 22#endif 23 24#include <string.h> 25#include <stdlib.h> 26 27#include <pulse/xmalloc.h> 28 29#include <pulsecore/dynarray.h> 30#include <pulsecore/macro.h> 31 32#include "tokenizer.h" 33 34static void parse(pa_dynarray*a, const char *s, unsigned args) { 35 int infty = 0; 36 const char delimiter[] = " \t\n\r"; 37 const char *p; 38 39 pa_assert(a); 40 pa_assert(s); 41 42 if (args == 0) 43 infty = 1; 44 45 p = s+strspn(s, delimiter); 46 while (*p && (infty || args >= 2)) { 47 size_t l = strcspn(p, delimiter); 48 char *n = pa_xstrndup(p, l); 49 pa_dynarray_append(a, n); 50 p += l; 51 p += strspn(p, delimiter); 52 args--; 53 } 54 55 if (args && *p) { 56 char *n = pa_xstrdup(p); 57 pa_dynarray_append(a, n); 58 } 59} 60 61pa_tokenizer* pa_tokenizer_new(const char *s, unsigned args) { 62 pa_dynarray *a; 63 64 a = pa_dynarray_new(pa_xfree); 65 parse(a, s, args); 66 return (pa_tokenizer*) a; 67} 68 69void pa_tokenizer_free(pa_tokenizer *t) { 70 pa_dynarray *a = (pa_dynarray*) t; 71 72 pa_assert(a); 73 pa_dynarray_free(a); 74} 75 76const char *pa_tokenizer_get(pa_tokenizer *t, unsigned i) { 77 pa_dynarray *a = (pa_dynarray*) t; 78 79 pa_assert(a); 80 81 return pa_dynarray_get(a, i); 82} 83