00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00039 #ifndef _BSTR_H
00040 #define _BSTR_H
00041
00042 #ifdef __cplusplus
00043 extern "C" {
00044 #endif
00045
00046 typedef struct bstr_t bstr;
00047
00048 #include <stdio.h>
00049 #include <stdlib.h>
00050 #include <stdint.h>
00051 #include <string.h>
00052
00053 #include "bstr_builder.h"
00054
00055
00056
00057 struct bstr_t {
00059 size_t len;
00060
00064 size_t size;
00065
00071 unsigned char *realptr;
00072 };
00073
00074
00075
00076
00077 #define bstr_len(X) ((*(X)).len)
00078 #define bstr_size(X) ((*(X)).size)
00079 #define bstr_ptr(X) ( ((*(X)).realptr == NULL) ? ((unsigned char *)(X) + sizeof(bstr)) : (unsigned char *)(*(X)).realptr )
00080 #define bstr_realptr(X) ((*(X)).realptr)
00081
00082
00083
00084
00095 bstr *bstr_add(bstr *bdestination, const bstr *bsource);
00096
00107 bstr *bstr_add_c(bstr *b, const char *cstr);
00108
00118 bstr *bstr_add_c_noex(bstr *b, const char *cstr);
00119
00131 bstr *bstr_add_mem(bstr *b, const void *data, size_t len);
00132
00143 bstr *bstr_add_mem_noex(bstr *b, const void *data, size_t len);
00144
00154 bstr *bstr_add_noex(bstr *bdestination, const bstr *bsource);
00155
00164 void bstr_adjust_len(bstr *b, size_t newlen);
00165
00173 void bstr_adjust_realptr(bstr *b, void *newrealptr);
00174
00184 void bstr_adjust_size(bstr *b, size_t newsize);
00185
00192 bstr *bstr_alloc(size_t size);
00193
00201 int bstr_begins_with(const bstr *bhaystack, const bstr *bneedle);
00202
00210 int bstr_begins_with_c(const bstr *bhaystack, const char *cneedle);
00211
00219 int bstr_begins_with_c_nocase(const bstr *bhaystack, const char *cneedle);
00220
00229 int bstr_begins_with_mem(const bstr *bhaystack, const void *data, size_t len);
00230
00239 int bstr_begins_with_mem_nocase(const bstr *bhaystack, const void *data, size_t len);
00240
00248 int bstr_begins_with_nocase(const bstr *bhaystack, const bstr *cneedle);
00249
00257 int bstr_char_at(const bstr *b, size_t pos);
00258
00267 int bstr_char_at_end(const bstr *b, size_t pos);
00268
00276 void bstr_chop(bstr *b);
00277
00285 int bstr_chr(const bstr *b, int c);
00286
00295 int bstr_cmp(const bstr *b1, const bstr *b2);
00296
00305 int bstr_cmp_c(const bstr *b, const char *cstr);
00306
00314 int bstr_cmp_c_nocase(const bstr *b, const char *cstr);
00315
00324 int bstr_cmp_mem(const bstr *b, const void *data, size_t len);
00325
00334 int bstr_cmp_mem_nocase(const bstr *b, const void *data, size_t len);
00335
00344 int bstr_cmp_nocase(const bstr *b1, const bstr *b2);
00345
00352 bstr *bstr_dup(const bstr *b);
00353
00360 bstr *bstr_dup_c(const char *cstr);
00361
00370 bstr *bstr_dup_ex(const bstr *b, size_t offset, size_t len);
00371
00378 bstr *bstr_dup_lower(const bstr *b);
00379
00387 bstr *bstr_dup_mem(const void *data, size_t len);
00388
00400 bstr *bstr_expand(bstr *b, size_t newsize);
00401
00408 void bstr_free(bstr *b);
00409
00417 int bstr_index_of(const bstr *bhaystack, const bstr *bneedle);
00418
00426 int bstr_index_of_nocase(const bstr *bhaystack, const bstr *bneedle);
00427
00436 int bstr_index_of_c(const bstr *bhaystack, const char *cneedle);
00437
00446 int bstr_index_of_c_nocase(const bstr *bhaystack, const char *cneedle);
00447
00456 int bstr_index_of_mem(const bstr *bhaystack, const void *data, size_t len);
00457
00467 int bstr_index_of_mem_nocase(const bstr *bhaystack, const void *data, size_t len);
00468
00476 int bstr_rchr(const bstr *b, int c);
00477
00485 bstr *bstr_to_lowercase(bstr *b);
00486
00497 int bstr_util_cmp_mem(const void *data1, size_t len1, const void *data2, size_t len2);
00498
00509 int bstr_util_cmp_mem_nocase(const void *data1, size_t len1, const void *data2, size_t len2);
00510
00523 int64_t bstr_util_mem_to_pint(const void *data, size_t len, int base, size_t *lastlen);
00524
00533 int bstr_util_mem_index_of_c(const void *data, size_t len, const char *cstr);
00534
00543 int bstr_util_mem_index_of_c_nocase(const void *data, size_t len, const char *cstr);
00544
00554 int bstr_util_mem_index_of_mem(const void *data1, size_t len1, const void *data2, size_t len2);
00555
00565 int bstr_util_mem_index_of_mem_nocase(const void *data1, size_t len1, const void *data2, size_t len2);
00566
00574 void bstr_util_mem_trim(unsigned char **data, size_t *len);
00575
00587 char *bstr_util_memdup_to_c(const void *data, size_t len);
00588
00599 char *bstr_util_strdup_to_c(const bstr *b);
00600
00609 bstr *bstr_wrap_c(const char *cstr);
00610
00620 bstr *bstr_wrap_mem(const void *data, size_t len);
00621
00622 #ifdef __cplusplus
00623 }
00624 #endif
00625
00626 #endif