blitz_string.h 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. #ifndef BLITZ_STRING_H
  2. #define BLITZ_STRING_H
  3. #include "blitz_types.h"
  4. #define XXH_STATIC_LINKING_ONLY
  5. #include "hash/xxhash.h"
  6. #ifdef __cplusplus
  7. extern "C"{
  8. #endif
  9. #define BBNULLSTRING (&bbEmptyString)
  10. struct BBString{
  11. BBClass* clas;
  12. BBULONG hash;
  13. int length;
  14. BBChar buf[];
  15. };
  16. struct BBClass_String{
  17. //extends BBGCPool
  18. BBClass* super;
  19. void (*free)( BBObject *o );
  20. BBDebugScope*debug_scope;
  21. unsigned int instance_size;
  22. void (*ctor)( BBObject *o );
  23. void (*dtor)( BBObject *o );
  24. BBString* (*ToString)( BBObject *x );
  25. int (*Compare)( BBObject *x,BBObject *y );
  26. BBObject* (*SendMessage)( BBObject * o, BBObject *m,BBObject *s );
  27. BBINTERFACETABLE itable;
  28. void* extra;
  29. unsigned int obj_size;
  30. unsigned int instance_count;
  31. unsigned int fields_offset;
  32. int (*bbStringFind)( BBString *x,BBString *y,int i );
  33. int (*bbStringFindLast)( BBString *x,BBString *y,int i );
  34. BBString* (*bbStringTrim)( BBString *str );
  35. BBString* (*bbStringReplace)( BBString *str,BBString *sub,BBString *rep );
  36. BBString* (*bbStringToLower)( BBString *str );
  37. BBString* (*bbStringToUpper)( BBString *str );
  38. int (*bbStringToInt)( BBString *t );
  39. BBInt64 (*bbStringToLong)( BBString *t );
  40. float (*bbStringToFloat)( BBString *t );
  41. double (*bbStringToDouble)( BBString *t );
  42. unsigned char* (*bbStringToCString)( BBString *str );
  43. BBChar* (*bbStringToWString)( BBString *str );
  44. BBString* (*bbStringFromInt)( int n );
  45. BBString* (*bbStringFromLong)( BBInt64 n );
  46. BBString* (*bbStringFromFloat)( float n );
  47. BBString* (*bbStringFromDouble)( double n );
  48. BBString* (*bbStringFromCString)( const char *p );
  49. BBString* (*bbStringFromWString)( const BBChar *p );
  50. BBString* (*bbStringFromBytes)( const unsigned char *p,int n );
  51. BBString* (*bbStringFromShorts)( const unsigned short *p,int n );
  52. int (*bbStringStartsWith)( BBString *x,BBString *y );
  53. int (*bbStringEndsWith)( BBString *x,BBString *y );
  54. int (*bbStringContains)( BBString *x,BBString *y );
  55. BBArray* (*bbStringSplit)( BBString *str,BBString *sep );
  56. BBString* (*bbStringJoin)( BBString *sep,BBArray *bits );
  57. BBString* (*bbStringFromUTF8String)( const unsigned char *p );
  58. unsigned char* (*bbStringToUTF8String)( BBString *str );
  59. BBString* (*bbStringFromUTF8Bytes)( const unsigned char *p,int n );
  60. BBSIZET (*bbStringToSizet)( BBString *t );
  61. BBString* (*bbStringFromSizet)( BBSIZET n );
  62. unsigned int (*bbStringToUInt)( BBString *t );
  63. BBString* (*bbStringFromUInt)( unsigned int n );
  64. BBUInt64 (*bbStringToULong)( BBString *t );
  65. BBString* (*bbStringFromULong)( BBUInt64 n );
  66. #ifdef _WIN32
  67. WPARAM (*bbStringToWParam)( BBString *t );
  68. BBString* (*bbStringFromWParam)( WPARAM n );
  69. LPARAM (*bbStringToLParam)( BBString *t );
  70. BBString* (*bbStringFromLParam)( LPARAM n );
  71. #endif
  72. unsigned char* (*bbStringToUTF8StringBuffer)( BBString *str, unsigned char * buf, size_t * length );
  73. BBULONG (*bbStringHash)( BBString * x );
  74. BBUINT* (*bbStringToUTF32String)( BBString *str );
  75. BBString* (*bbStringFromUTF32String)( const BBUINT *p );
  76. BBString* (*bbStringFromUTF32Bytes)( const BBUINT *p, int n );
  77. BBChar* (*bbStringToWStringBuffer)( BBString *str, BBChar * buf, size_t * length );
  78. BBLONGINT (*bbStringToLongInt)( BBString *t );
  79. BBString* (*bbStringFromLongInt)( BBLONGINT n );
  80. BBULONGINT (*bbStringToULongInt)( BBString *t );
  81. BBString* (*bbStringFromULongInt)( BBULONGINT n );
  82. int (*bbStringToDoubleEx)( BBString *str, double *val, int start, int end, BBULONG format, BBString *sep );
  83. int (*bbStringToFloatEx)( BBString *str, float *val, int start, int end, BBULONG format, BBString *sep );
  84. int (*bbStringToIntEx)( BBString *str, int *val, int start, int end, BBULONG format, int base );
  85. int (*bbStringToUIntEx)( BBString *str, unsigned int *val, int start, int end, BBULONG format, int base );
  86. int (*bbStringToLongEx)( BBString *str, BBInt64 *val, int start, int end, BBULONG format, int base );
  87. int (*bbStringToULongEx)( BBString *str, BBUInt64 *val, int start, int end, BBULONG format, int base );
  88. int (*bbStringToSizeTEx)( BBString *str, BBSIZET *val, int start, int end, BBULONG format, int base );
  89. int (*bbStringToLongIntEx)( BBString *str, BBLONGINT *val, int start, int end, BBULONG format, int base );
  90. int (*bbStringToULongIntEx)( BBString *str, BBULONGINT *val, int start, int end, BBULONG format, int base );
  91. };
  92. extern struct BBClass_String bbStringClass;
  93. extern BBString bbEmptyString;
  94. BBString*bbStringNew( int len );
  95. BBString*bbStringFromChar( int c );
  96. BBString* bbStringFromInt( int n );
  97. BBString* bbStringFromUInt( unsigned int n );
  98. BBString* bbStringFromLong( BBInt64 n );
  99. BBString* bbStringFromULong( BBUInt64 n );
  100. BBString* bbStringFromSizet( BBSIZET n );
  101. BBString*bbStringFromFloat( float n );
  102. BBString* bbStringFromDouble( double n );
  103. BBString* bbStringFromBytes( const unsigned char *p,int n );
  104. BBString* bbStringFromShorts( const unsigned short *p,int n );
  105. BBString* bbStringFromInts( const int *p,int n );
  106. BBString* bbStringFromUInts( const unsigned int *p,int n );
  107. BBString*bbStringFromArray( BBArray *arr );
  108. BBString* bbStringFromCString( const char *p );
  109. BBString*bbStringFromWString( const BBChar *p );
  110. BBString*bbStringFromUTF8String( const unsigned char *p );
  111. BBString *bbStringFromUTF8Bytes( const unsigned char *p,int n );
  112. BBString* bbStringFromLongInt( BBLONGINT n );
  113. BBString* bbStringFromULongInt( BBULONGINT n );
  114. BBString* bbStringToString( BBString *t );
  115. int bbStringCompare( BBString *x,BBString *y );
  116. int bbStringStartsWith( BBString *x,BBString *y );
  117. int bbStringEndsWith( BBString *x,BBString *y );
  118. int bbStringContains( BBString *x,BBString *y );
  119. BBString*bbStringConcat( BBString *x,BBString *y );
  120. BBString* bbStringTrim( BBString *t );
  121. BBString* bbStringSlice( BBString *t,int beg,int end );
  122. BBString* bbStringReplace( BBString *str,BBString *sub,BBString *rep );
  123. int bbStringAsc( BBString *t );
  124. int bbStringFind( BBString *x,BBString *y,int i );
  125. int bbStringFindLast( BBString *x,BBString *y,int i );
  126. BBString* bbStringToLower( BBString *str );
  127. BBString* bbStringToUpper( BBString *str );
  128. int bbStringToInt( BBString *str );
  129. unsigned int bbStringToUInt( BBString *str );
  130. float bbStringToFloat( BBString *str );
  131. double bbStringToDouble( BBString *str );
  132. BBInt64 bbStringToLong( BBString *str );
  133. BBUInt64 bbStringToULong( BBString *str );
  134. BBSIZET bbStringToSizet( BBString *str );
  135. unsigned char* bbStringToCString( BBString *str );
  136. BBChar* bbStringToWString( BBString *str );
  137. unsigned char* bbStringToUTF8String( BBString *str );
  138. BBLONGINT bbStringToLongInt( BBString *str );
  139. BBULONGINT bbStringToULongInt( BBString *str );
  140. int bbStringToDoubleEx( BBString *str, double *val, int start, int end, BBULONG format, BBString *sep );
  141. int bbStringToFloatEx( BBString *str, float *val, int start, int end, BBULONG format, BBString *sep );
  142. int bbStringToIntEx( BBString *str, int *val, int start, int end, BBULONG format, int base );
  143. int bbStringToUIntEx( BBString *str, unsigned int *val, int start, int end, BBULONG format, int base );
  144. int bbStringToLongEx( BBString *str, BBInt64 *val, int start, int end, BBULONG format, int base );
  145. int bbStringToULongEx( BBString *str, BBUInt64 *val, int start, int end, BBULONG format, int base );
  146. int bbStringToSizeTEx( BBString *str, BBSIZET *val, int start, int end, BBULONG format, int base );
  147. int bbStringToLongIntEx( BBString *str, BBLONGINT *val, int start, int end, BBULONG format, int base );
  148. int bbStringToULongIntEx( BBString *str, BBULONGINT *val, int start, int end, BBULONG format, int base );
  149. BBUINT* bbStringToUTF32String( BBString *str );
  150. BBString* bbStringFromUTF32String( const BBUINT *p );
  151. BBString* bbStringFromUTF32Bytes( const BBUINT *p, int n );
  152. #ifdef _WIN32
  153. WPARAM bbStringToWParam( BBString *str );
  154. LPARAM bbStringToLParam( BBString *str );
  155. BBString* bbStringFromWParam( WPARAM n );
  156. BBString* bbStringFromLParam( LPARAM n );
  157. #endif
  158. BBArray* bbStringSplit( BBString *str,BBString *sep );
  159. BBString* bbStringJoin( BBString *sep,BBArray *bits );
  160. char* bbTmpCString( BBString *str );
  161. BBChar* bbTmpWString( BBString *str );
  162. char* bbTmpUTF8String( BBString *str );
  163. #if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
  164. inline BBULONG bbStringHash( BBString * x ) {
  165. if (x->hash > 0) return x->hash;
  166. x->hash = XXH3_64bits(x->buf, x->length * sizeof(BBChar));
  167. return x->hash;
  168. }
  169. inline int bbStringEquals( BBString *x,BBString *y ){
  170. if (x->clas != (BBClass *)&bbStringClass || y->clas != (BBClass *)&bbStringClass) return 0; // only strings with strings
  171. if (x->length-y->length != 0) return 0;
  172. if (x->hash != 0 ) {
  173. if (!y->hash) bbStringHash(y);
  174. return (x->hash == y->hash);
  175. }
  176. return memcmp(x->buf, y->buf, x->length * sizeof(BBChar)) == 0;
  177. }
  178. inline int bbObjectIsEmptyString(BBObject * o) {
  179. return (BBString*)o == &bbEmptyString;
  180. }
  181. #else
  182. int bbStringEquals( BBString *x,BBString *y );
  183. int bbObjectIsEmptyString(BBObject * o);
  184. BBULONG bbStringHash( BBString * x );
  185. #endif
  186. unsigned char *bbStringToUTF8StringBuffer( BBString *str, unsigned char * buf, size_t * length );
  187. BBChar *bbStringToWStringBuffer( BBString *str, BBChar * buf, size_t * length );
  188. #ifdef __cplusplus
  189. }
  190. #endif
  191. #endif