80 va_end(ap); |
80 va_end(ap); |
81 |
81 |
82 return s; |
82 return s; |
83 } |
83 } |
84 |
84 |
85 sstr_t sstrsubs (sstr_t s, size_t start) { |
85 sstr_t sstrsubs (const sstr_t s, size_t start) { |
86 return sstrsubsl (s, start, s.length-start); |
86 return sstrsubsl (s, start, s.length-start); |
87 } |
87 } |
88 |
88 |
89 sstr_t sstrsubsl (sstr_t s, size_t start, size_t length) { |
89 sstr_t sstrsubsl (const sstr_t s, size_t start, size_t length) { |
90 sstr_t new_sstr; |
90 sstr_t new_sstr; |
91 if (start < 0 || start >= s.length || length < 0) { |
91 if (start < 0 || start >= s.length || length < 0) { |
92 return s; |
92 return s; |
93 } |
93 } |
94 if (length > s.length-start) { |
94 if (length > s.length-start) { |
153 free(sv.ptr); |
153 free(sv.ptr); |
154 |
154 |
155 return result; |
155 return result; |
156 } |
156 } |
157 |
157 |
158 int sstrcmp(sstr_t s1, sstr_t s2) { |
158 int sstrcmp(const sstr_t s1, const sstr_t s2) { |
159 return strncmp(s1.ptr, s2.ptr, s1.length>s2.length ? s2.length: s1.length); |
159 return strncmp(s1.ptr, s2.ptr, s1.length>s2.length ? s2.length: s1.length); |
160 } |
160 } |
161 |
161 |
162 sstr_t sstrdup(sstr_t s) { |
162 sstr_t sstrdup(const sstr_t s) { |
163 sstr_t newstring; |
163 sstr_t newstring; |
164 newstring.ptr = (char*) malloc(s.length + 1); |
164 newstring.ptr = (char*) malloc(s.length + 1); |
165 if (newstring.ptr != NULL) { |
165 if (newstring.ptr != NULL) { |
166 newstring.length = s.length; |
166 newstring.length = s.length; |
167 newstring.ptr[newstring.length] = 0; |
167 newstring.ptr[newstring.length] = 0; |