fork of PCE focusing on macplus, supporting DaynaPort SCSI network emulation
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}