00001 #ifndef __J2K__JSTRING_C__
00002 #define __J2K__JSTRING_C__
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include <j2k/Fred/fast_alloc.c>
00021
00022
00023 typedef struct _JString_t
00024 {
00025 size_t bufferSize;
00026 size_t length;
00027 short nbRefs;
00028 char lock;
00029
00030 char data[1];
00031
00032 } JString_t;
00033
00034
00035 typedef struct _JSubString_t
00036 {
00037 size_t pos;
00038 size_t len;
00039 JString_t* str;
00040 _JSubString_t* next;
00041
00042 } JSubString_t;
00043
00044 #define JSTRING_SIZE ( sizeof( JString_t ) )
00045 #define JSUBSTRING_SIZE ( sizeof( JSubString_t ) )
00046
00047 #define JSTRING_INIT { 0, 0, 1, 0, { 0 } }
00048 #define JSUBSTRING_INIT { 0, 0, 0, 0 }
00049
00050
00051
00052
00053 JString_t* JString_malloc( register size_t buffer_size )
00054 {
00055 buffer_size += sizeof( JString_t );
00056 return (JString_t*)fast_malloc( buffer_size );
00057 }
00058
00059 JString_t* JString_calloc( register size_t buffer_size )
00060 {
00061 buffer_size += sizeof( JString_t );
00062 JString_t* s = (JString_t*)fast_malloc( buffer_size );
00063 memset( s, 0, buffer_size );
00064 s->nbRefs = 1;
00065 return s;
00066 }
00067
00068 void JString_free( JString_t* this )
00069 {
00070
00071 if( --this->nbRefs <= 0 && this->lock == 0 )
00072 {
00073 free( this );
00074 }
00075 }
00076
00077
00078 JString_t* JString_create( const char* str, register size_t length, register size_t buffer_size )
00079 {
00080
00081 if ( buffer_size < length )
00082 {
00083 buffer_size = length;
00084 }
00085
00086 JString_t* s = JString_calloc( buffer_size );
00087
00088 if ( str != NULL )
00089 {
00090 memcpy( s->data, str, length );
00091 }
00092
00093 return s;
00094 }
00095
00096 JString_t* JString_safe_create( const char* str )
00097 {
00098 return JString_create( str, strlen( str ), 80 );
00099 }
00100
00101 #endif