#ifndef _CSTR_H_ #define _CSTR_H_ /* A general-purpose string "class" for C */ #if !defined(P) #ifdef __STDC__ #define P(x) x #else #define P(x) () #endif #endif /* For building dynamic link libraries under windows, windows NT * using MSVC1.5 or MSVC2.0 */ #ifndef _DLLDECL #define _DLLDECL #ifdef MSVC15 /* MSVC1.5 support for 16 bit apps */ #define _MSVC15EXPORT _export #define _MSVC20EXPORT #define _DLLAPI _export _pascal #define _CDECL #define _TYPE(a) a _MSVC15EXPORT #define DLLEXPORT 1 #elif defined(MSVC20) || (defined(_USRDLL) && defined(SRP_EXPORTS)) #define _MSVC15EXPORT #define _MSVC20EXPORT _declspec(dllexport) #define _DLLAPI #define _CDECL #define _TYPE(a) _MSVC20EXPORT a #define DLLEXPORT 1 #else /* Default, non-dll. Use this for Unix or DOS */ #define _MSVC15DEXPORT #define _MSVC20EXPORT #define _DLLAPI #if defined(WINDOWS) || defined(WIN32) #define _CDECL _cdecl #else #define _CDECL #endif #define _TYPE(a) a _CDECL #endif #endif /* _DLLDECL */ #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ /* Arguments to allocator methods ordered this way for compatibility */ typedef struct cstr_alloc_st { void * (_CDECL * alloc)(size_t n, void * heap); void (_CDECL * free)(void * p, void * heap); void * heap; } cstr_allocator; typedef struct cstr_st { char * data; /* Okay to access data and length fields directly */ int length; int cap; int ref; /* Simple reference counter */ cstr_allocator * allocator; } cstr; _TYPE( void ) cstr_set_allocator P((cstr_allocator * alloc)); _TYPE( cstr * ) cstr_new P((void)); _TYPE( cstr * ) cstr_new_alloc P((cstr_allocator * alloc)); _TYPE( cstr * ) cstr_dup P((const cstr * str)); _TYPE( cstr * ) cstr_dup_alloc P((const cstr * str, cstr_allocator * alloc)); _TYPE( cstr * ) cstr_create P((const char * s)); _TYPE( cstr * ) cstr_createn P((const char * s, int len)); _TYPE( void ) cstr_free P((cstr * str)); _TYPE( void ) cstr_clear_free P((cstr * str)); _TYPE( void ) cstr_use P((cstr * str)); _TYPE( void ) cstr_empty P((cstr * str)); _TYPE( int ) cstr_copy P((cstr * dst, const cstr * src)); _TYPE( int ) cstr_set P((cstr * str, const char * s)); _TYPE( int ) cstr_setn P((cstr * str, const char * s, int len)); _TYPE( int ) cstr_set_length P((cstr * str, int len)); _TYPE( int ) cstr_append P((cstr * str, const char * s)); _TYPE( int ) cstr_appendn P((cstr * str, const char * s, int len)); _TYPE( int ) cstr_append_str P((cstr * dst, const cstr * src)); #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* _CSTR_H_ */