Пример #1
0
//----------------------------------------------------------------//
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;
}
Пример #2
0
//----------------------------------------------------------------//
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;
}
Пример #3
0
//----------------------------------------------------------------//
char* ZIPFSString_Set ( ZIPFSString* self, const char* str ) {

	self->mStrLen = strlen ( str );
	ZIPFSString_Grow ( self, self->mStrLen );
	strcpy ( self->mMem, str );
	
	return self->mMem;
}
Пример #4
0
//----------------------------------------------------------------//
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;
}
Пример #5
0
//----------------------------------------------------------------//
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;
}
Пример #6
0
//----------------------------------------------------------------//
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;
}
Пример #7
0
//----------------------------------------------------------------//
void ZIPFSString_PushChar ( ZIPFSString* self, char c ) {

	ZIPFSString_Grow ( self, self->mStrLen + 1 );
	self->mMem [ self->mStrLen++ ] = c;
}