fork of PCE focusing on macplus, supporting DaynaPort SCSI network emulation
at master 182 lines 3.5 kB view raw
1/***************************************************************************** 2 * pce * 3 *****************************************************************************/ 4 5/***************************************************************************** 6 * File name: src/lib/string.c * 7 * Created: 2009-06-23 by Hampa Hug <hampa@hampa.ch> * 8 * Copyright: (C) 2009 Hampa Hug <hampa@hampa.ch> * 9 *****************************************************************************/ 10 11/***************************************************************************** 12 * This program is free software. You can redistribute it and / or modify it * 13 * under the terms of the GNU General Public License version 2 as published * 14 * by the Free Software Foundation. * 15 * * 16 * This program is distributed in the hope that it will be useful, but * 17 * WITHOUT ANY WARRANTY, without even the implied warranty of * 18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General * 19 * Public License for more details. * 20 *****************************************************************************/ 21 22 23#include <config.h> 24 25#include <stdlib.h> 26#include <stdio.h> 27#include <string.h> 28#include <time.h> 29 30#include <lib/string.h> 31 32 33char *str_cat_alloc (const char *str1, const char *str2) 34{ 35 char *ret; 36 unsigned long n1, n2; 37 38 n1 = (str1 == NULL) ? 0 : strlen (str1); 39 n2 = (str2 == NULL) ? 0 : strlen (str2); 40 41 ret = malloc (n1 + n2 + 1); 42 43 if (ret == NULL) { 44 return (NULL); 45 } 46 47 if (n1 > 0) { 48 memcpy (ret, str1, n1); 49 } 50 51 if (n2 > 0) { 52 memcpy (ret + n1, str2, n2); 53 } 54 55 ret[n1 + n2] = 0; 56 57 return (ret); 58} 59 60char *str_cut_alloc (const char *str, unsigned long cnt) 61{ 62 unsigned long i; 63 char *ret; 64 65 ret = malloc (cnt + 1); 66 67 if (ret == NULL) { 68 return (NULL); 69 } 70 71 i = 0; 72 73 while ((i < cnt) && (str[i] != 0)) { 74 ret[i] = str[i]; 75 i += 1; 76 } 77 78 ret[i] = 0; 79 80 return (ret); 81} 82 83char *str_copy_alloc (const char *str) 84{ 85 char *ret; 86 unsigned long n; 87 88 n = (str == NULL) ? 0 : strlen (str); 89 90 ret = malloc (n + 1); 91 92 if (ret == NULL) { 93 return (NULL); 94 } 95 96 if (n > 0) { 97 memcpy (ret, str, n); 98 } 99 100 ret[n] = 0; 101 102 return (ret); 103} 104 105char *str_trim (char *str, const char *left, const char *right) 106{ 107 unsigned long i; 108 109 if (str == NULL) { 110 return (NULL); 111 } 112 113 if (left != NULL) { 114 while (*str != 0) { 115 if (strchr (left, *str) == NULL) { 116 break; 117 } 118 119 str += 1; 120 } 121 } 122 123 if (right != NULL) { 124 i = strlen (str); 125 126 while (i > 0) { 127 if (strchr (right, str[i - 1]) == NULL) { 128 break; 129 } 130 131 i -= 1; 132 } 133 134 str[i] = 0; 135 } 136 137 return (str); 138} 139 140const char *str_ltrim (const char *str, const char *left) 141{ 142 if (str == NULL) { 143 return (NULL); 144 } 145 146 if (left == NULL) { 147 return (str); 148 } 149 150 while ((*str != 0) && (strchr (left, *str) != NULL)) { 151 str += 1; 152 } 153 154 return (str); 155} 156 157char *str_extract_alloc (const char *str, const char *sep, const char **rest) 158{ 159 char *ret; 160 unsigned long i; 161 162 if (str == NULL) { 163 return (NULL); 164 } 165 166 i = 0; 167 while ((str[i] != 0) && (strchr (sep, str[i]) == NULL)) { 168 i += 1; 169 } 170 171 ret = str_cut_alloc (str, i); 172 173 if (*rest != NULL) { 174 if (str[i] != 0) { 175 i += 1; 176 } 177 178 *rest = str + i; 179 } 180 181 return (ret); 182}