//----------------------------------------------------------------// char* zipfs_get_working_path ( void ) { char* result = 0; if ( !sWorkingPath->mStrLen ) { ZIPFSString_Grow ( sBuffer, MOAIO_STRING_BLOCK_SIZE ); while ( !result ) { result = getcwd ( sBuffer->mMem, sBuffer->mSize ); if ( !result ) { ZIPFSString_Grow ( sBuffer, sBuffer->mSize + MOAIO_STRING_BLOCK_SIZE ); } else { size_t pathlen = strlen ( result ); sBuffer->mStrLen = pathlen; if ( result [ pathlen ] != '/' ) { ZIPFSString_Append ( sBuffer, "/" ); } } } zipfs_bless_path ( result ); ZIPFSString_Set ( sWorkingPath, result ); } ZIPFSString_Set ( sBuffer, sWorkingPath->mMem ); return sBuffer->mMem; }
//----------------------------------------------------------------// char* ZIPFSString_Shift ( ZIPFSString* self, size_t base, size_t length, size_t newbase ) { size_t i; if ( base == newbase ) return self->mMem; for ( i = base; self->mMem [ i ]; ++i ); if ( i < length ) { length = i; } ZIPFSString_Grow ( self, newbase + length ); if ( newbase < base ) { for ( i = 0; i < length; ++i ) { self->mMem [ newbase + i ] = self->mMem [ base + i ]; } } else { size_t offset = length - 1; for ( i = 0; i < length; ++i ) { self->mMem [ newbase + offset - i ] = self->mMem [ base + offset - i ]; } } return self->mMem; }
//----------------------------------------------------------------// char* ZIPFSString_Set ( ZIPFSString* self, const char* str ) { self->mStrLen = strlen ( str ); ZIPFSString_Grow ( self, self->mStrLen ); strcpy ( self->mMem, str ); return self->mMem; }
//----------------------------------------------------------------// char* zipfs_normalize_path ( const char* path ) { size_t i = 0; size_t top = 0; size_t length = strlen ( path ); char* buffer = ZIPFSString_Grow ( sBuffer, length ); buffer = zipfs_bless_path ( path ); // normalize the path for ( ; buffer [ i ]; ++i ) { if ( buffer [ i ] == '.' ) { if ( buffer [ i + 1 ] == '/' ) { i += 1; continue; } if (( buffer [ i + 1 ] == '.' ) && ( buffer [ i + 2 ] == '/' )) { size_t j = top; for ( ; j > 0; --j ) { if ( buffer [ j ] == '/' ) { size_t k = j - 1; for ( ; k > 0; --k ) { if ( buffer [ k ] == '/' ) { top = k + 1; buffer [ top ] = 0; break; } } break; } } i += 2; continue; } } buffer [ top++ ] = buffer [ i ]; } buffer [ top ] = 0; return buffer; }
//----------------------------------------------------------------// char* ZIPFSString_Append ( ZIPFSString* self, const char* str ) { size_t size; char* append; size = strlen ( str ); ZIPFSString_Grow ( self, self->mStrLen + size ); append = &self->mMem [ self->mStrLen ]; strcpy ( append, str ); self->mStrLen += size; return self->mMem; }
//----------------------------------------------------------------// char* zipfs_bless_path ( const char* path ) { size_t i = 0; size_t j = 0; for ( i = 0; path [ i ]; ++i ) { if ( is_separator ( path [ i ] )) { while ( is_separator ( path [ ++i ])); --i; } j++; } ZIPFSString_Grow ( sBuffer, j ); i = 0; j = 0; for ( i = 0; path [ i ]; ++i ) { char c = path [ i ]; if ( is_separator ( c )) { c = '/'; while ( is_separator ( path [ ++i ])); --i; } sBuffer->mMem [ j++ ] = c; } sBuffer->mMem [ j ] = 0; sBuffer->mStrLen = j; return sBuffer->mMem; }
//----------------------------------------------------------------// void ZIPFSString_PushChar ( ZIPFSString* self, char c ) { ZIPFSString_Grow ( self, self->mStrLen + 1 ); self->mMem [ self->mStrLen++ ] = c; }