/* * ORC - Library of Optimized Inner Loops * Copyright (c) 2003,2004 David A. Schleef * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include #include /** * SECTION:orcutils * @title: Utility functions * @short_description: Orc utility functions */ char * _strndup (const char *s, int n) { char *r; r = malloc (n+1); memcpy(r,s,n); r[n]=0; return r; } char ** strsplit (const char *s, char delimiter) { char **list = NULL; const char *tok; int n = 0; while (*s == ' ') s++; list = malloc (1 * sizeof(char *)); while (*s) { tok = s; while (*s && *s != delimiter) s++; list[n] = _strndup (tok, s - tok); while (*s && *s == delimiter) s++; list = realloc (list, (n + 2) * sizeof(char *)); n++; } list[n] = NULL; return list; } char * get_tag_value (char *s, const char *tag) { char *flags; char *end; char *colon; flags = strstr(s,tag); if (flags == NULL) return NULL; end = strchr(flags, '\n'); if (end == NULL) return NULL; colon = strchr (flags, ':'); if (colon == NULL) return NULL; colon++; if(colon >= end) return NULL; return _strndup (colon, end-colon); } orc_int64 _strtoll (const char *nptr, char **endptr, int base) { int neg = 0; orc_int64 val = 0; /* Skip all spaces */ while (isspace (*nptr)) nptr++; if (!*nptr) return val; /* Get sign */ if (*nptr == '-') { neg = 1; nptr++; } else if (*nptr == '+') { nptr++; } if (!*nptr) return val; /* Try to detect the base if none was given */ if (base == 0) { if (*nptr == '0' && (*(nptr + 1) == 'x' || *(nptr + 1) == 'X')) { base = 16; nptr += 2; } else if (*nptr == '0') { base = 8; nptr++; } else { base = 10; } } else if (base == 16) { if (*nptr == '0' && (*(nptr + 1) == 'x' || *(nptr + 1) == 'X')) nptr += 2; } else if (base == 8) { if (*nptr == '0') nptr++; } while (*nptr) { int c = *nptr; if (c >= '0' && c <= '9') c = c - '0'; else if (c >= 'a' && c <= 'z') c = 10 + c - 'a'; else if (c >= 'A' && c <= 'Z') c = 10 + c - 'A'; else break; if (c >= base) break; if ((orc_uint64) val > ORC_UINT64_C(0xffffffffffffffff) / base || (orc_uint64) (val * base) > ORC_UINT64_C(0xffffffffffffffff) - c) { val = ORC_UINT64_C(0xffffffffffffffff); break; } val = val * base + c; nptr++; } if (endptr) *endptr = (char *) nptr; return (neg) ? - val : val; }