From 6a6bd8fac21d06b426006a5e92f6e2696590a435 Mon Sep 17 00:00:00 2001 Message-Id: <6a6bd8fac21d06b426006a5e92f6e2696590a435.1714474450.git.mdw@distorted.org.uk> From: Mark Wooding Date: Wed, 15 Mar 2006 01:23:17 +0000 Subject: [PATCH] str: Support mLib's `str' functions. Organization: Straylight/Edgeware From: Mark Wooding --- defs.pxi | 11 +++++++ mLib.pyx | 4 +++ str.pyx | 95 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 110 insertions(+) create mode 100644 str.pyx diff --git a/defs.pxi b/defs.pxi index 10502f7..69f4adb 100644 --- a/defs.pxi +++ b/defs.pxi @@ -42,6 +42,7 @@ cdef extern from 'stddef.h': cdef extern from 'string.h': void memcpy(void *p, void *q, size_t n) char *strerror(int err) + size_t strlen(char *p) #----- Unix interface ------------------------------------------------------- @@ -151,6 +152,16 @@ cdef extern from 'mLib/sym.h': void sym_mkiter(sym_iter *i, sym_table *t) void *sym_next(sym_iter *i) +#----- String utilities ----------------------------------------------------- + +cdef extern from 'mLib/str.h': + enum: + STRF_QUOTE + char *str_qword(char **pp, unsigned f) + size_t str_qsplit(char *p, char **v, size_t c, char **rest, unsigned f) + int str_match(char *p, char *s) + void str_sanitize(char *d, char *p, size_t sz) + #----- Atom stuff ----------------------------------------------------------- # --- Atoms --- diff --git a/mLib.pyx b/mLib.pyx index 098ca6b..577a699 100644 --- a/mLib.pyx +++ b/mLib.pyx @@ -47,6 +47,10 @@ include 'sym.pyx' include 'atom.pyx' include 'assoc.pyx' +# --- String utilities --- + +include 'str.pyx' + # --- Encodings --- include 'base64.pyx' diff --git a/str.pyx b/str.pyx new file mode 100644 index 0000000..7ec1ed4 --- /dev/null +++ b/str.pyx @@ -0,0 +1,95 @@ +# -*-pyrex-*- +# +# $Id$ +# +# String utilities +# +# (c) 2006 Straylight/Edgeware +# + +#----- Licensing notice ----------------------------------------------------- +# +# This file is part of the Python interface to mLib. +# +# mLib/Python is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# mLib/Python is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with mLib/Python; if not, write to the Free Software Foundation, +# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +def word(char *p, quotep = False): + cdef unsigned f + cdef char *op + cdef char *pp + cdef char *q + cdef object w + cdef object r + + f = 0 + if quotep: + f = f | STRF_QUOTE + pp = op = xstrdup(p) + q = str_qword(&pp, f) + if q is NULL: + w = None + else: + w = q + if pp is NULL: + r = '' + else: + r = pp + xfree(op) + return w, r + +def split(char *p, int n = -1, quotep = False): + cdef unsigned f + cdef char *op + cdef char *pp + cdef char *q + cdef object l + cdef object r + + f = 0 + if quotep: + f = f | STRF_QUOTE + l = [] + op = pp = xstrdup(p) + while n != 0: + q = str_qword(&pp, f) + if q is NULL: + break + l.append(q) + if n > 0: + n = n - 1 + if pp is NULL: + r = '' + else: + r = pp + xfree(op) + return l, r + +def match(char *p, char *s): + return _tobool(str_match(p, s)) + +def sanitize(char *p, int n = -1): + cdef char *buf + cdef object d + + if n < 0: + n = strlen(p) + buf = xmalloc(n + 1) + str_sanitize(buf, p, n + 1) + d = buf + xfree(buf) + return d + + +#----- That's all, folks ---------------------------------------------------- -- [mdw]