FBCALL FBSTRING *fb_ExePath ( void ) { FBSTRING *dst; char *p; char tmp[MAX_PATH+1]; ssize_t len; p = fb_hGetExePath( tmp, MAX_PATH ); if( p != NULL ) { /* alloc temp string */ len = strlen( tmp ); dst = fb_hStrAllocTemp( NULL, len ); if( dst != NULL ) { fb_hStrCopy( dst->data, tmp, len ); } else dst = &__fb_ctx.null_desc; } else dst = &__fb_ctx.null_desc; return dst; }
/*:::::*/ FBCALL FBSTRING *fb_RTRIM ( FBSTRING *src ) { FBSTRING *dst; int len; if( src == NULL ) return &__fb_ctx.null_desc; FB_STRLOCK(); len = 0; if( src->data != NULL ) { len = FB_STRSIZE( src ); if( len > 0 ) { char *src_ptr = fb_hStrSkipCharRev( src->data, len, 32 ); len = (int)(src_ptr - src->data) + 1; } } if( len > 0 ) { /* alloc temp string */ dst = fb_hStrAllocTemp_NoLock( NULL, len ); if( dst != NULL ) { /* simple copy */ fb_hStrCopy( dst->data, src->data, len ); } else dst = &__fb_ctx.null_desc; } else dst = &__fb_ctx.null_desc; /* del if temp */ fb_hStrDelTemp_NoLock( src ); FB_STRUNLOCK(); return dst; }
FBCALL FBSTRING *fb_LEFT( FBSTRING *src, ssize_t chars ) { FBSTRING *dst; ssize_t len, src_len; if( src == NULL ) return &__fb_ctx.null_desc; FB_STRLOCK(); src_len = FB_STRSIZE( src ); if( (src->data != NULL) && (chars > 0) && (src_len > 0) ) { if( chars > src_len ) len = src_len; else len = chars; /* alloc temp string */ dst = fb_hStrAllocTemp_NoLock( NULL, len ); if( dst != NULL ) { /* simple copy */ fb_hStrCopy( dst->data, src->data, len ); } else dst = &__fb_ctx.null_desc; } else dst = &__fb_ctx.null_desc; /* del if temp */ fb_hStrDelTemp_NoLock( src ); FB_STRUNLOCK(); return dst; }
FBCALL FBSTRING *fb_LTrimAny ( FBSTRING *src, FBSTRING *pattern ) { const char *pachText = NULL; FBSTRING *dst; ssize_t len; if( src == NULL ) { fb_hStrDelTemp( pattern ); return &__fb_ctx.null_desc; } FB_STRLOCK(); len = 0; if( src->data != NULL ) { ssize_t len_pattern = ((pattern != NULL) && (pattern->data != NULL)? FB_STRSIZE( pattern ) : 0); pachText = src->data; len = FB_STRSIZE( src ); if( len_pattern != 0 ) { while ( len != 0 ) { ssize_t i; for( i=0; i!=len_pattern; ++i ) { if( FB_MEMCHR( pattern->data, *pachText, len_pattern )!=NULL ) break; } if( i==len_pattern ) break; --len; ++pachText; } } } if( len > 0 ) { /* alloc temp string */ dst = fb_hStrAllocTemp_NoLock( NULL, len ); if( dst != NULL ) { /* simple copy */ fb_hStrCopy( dst->data, pachText, len ); } else dst = &__fb_ctx.null_desc; } else dst = &__fb_ctx.null_desc; /* del if temp */ fb_hStrDelTemp_NoLock( src ); fb_hStrDelTemp_NoLock( pattern ); FB_STRUNLOCK(); return dst; }
/*:::::*/ FBCALL FBSTRING *fb_RTrimEx ( FBSTRING *src, FBSTRING *pattern ) { FBSTRING *dst; int len; if( src == NULL ) { fb_hStrDelTemp( pattern ); return &__fb_ctx.null_desc; } FB_STRLOCK(); if( src->data != NULL ) { size_t len_pattern = ((pattern != NULL) && (pattern->data != NULL)? FB_STRSIZE( pattern ) : 0); len = FB_STRSIZE( src ); if( len >= len_pattern ) { if( len_pattern==1 ) { char *src_ptr = fb_hStrSkipCharRev( src->data, len, FB_CHAR_TO_INT(pattern->data[0]) ); len = (int)(src_ptr - src->data) + 1; } else if( len_pattern != 0 ) { char *src_ptr = src->data; size_t test_index = len - len_pattern; while (len >= len_pattern ) { if( FB_MEMCMP( src_ptr + test_index, pattern->data, len_pattern )!=0 ) break; test_index -= len_pattern; } len = test_index + len_pattern; } } } else len = 0; if( len > 0 ) { /* alloc temp string */ dst = fb_hStrAllocTemp_NoLock( NULL, len ); if( dst != NULL ) { /* simple copy */ fb_hStrCopy( dst->data, src->data, len ); } else dst = &__fb_ctx.null_desc; } else dst = &__fb_ctx.null_desc; /* del if temp */ fb_hStrDelTemp_NoLock( src ); fb_hStrDelTemp_NoLock( pattern ); FB_STRUNLOCK(); return dst; }
FBCALL FBSTRING *fb_Dir( FBSTRING *filespec, int attrib, int *out_attrib ) { FB_DIRCTX *ctx; FBSTRING *res; ssize_t len; int tmp_attrib; char *name, *p; struct stat info; if( out_attrib == NULL ) out_attrib = &tmp_attrib; len = FB_STRSIZE( filespec ); name = NULL; ctx = FB_TLSGETCTX( DIR ); if( len > 0 ) { /* findfirst */ if( ctx->in_use ) close_dir( ); if( strchr( filespec->data, '*' ) || strchr( filespec->data, '?' ) ) { /* we have a pattern */ p = strrchr( filespec->data, '/' ); if( p ) { strncpy( ctx->filespec, p + 1, MAX_PATH ); ctx->filespec[MAX_PATH-1] = '\0'; len = (p - filespec->data) + 1; if( len > MAX_PATH - 1 ) len = MAX_PATH - 1; memcpy( ctx->dirname, filespec->data, len ); ctx->dirname[len] = '\0'; } else { strncpy( ctx->filespec, filespec->data, MAX_PATH ); ctx->filespec[MAX_PATH-1] = '\0'; strcpy( ctx->dirname, "./"); } /* Make sure these patterns work just like on Win32/DOS */ if( (!strcmp( ctx->filespec, "*.*" )) || (!strcmp( ctx->filespec, "*." )) ) strcpy( ctx->filespec, "*" ); if( (attrib & 0x10) == 0 ) attrib |= 0x20; ctx->attrib = attrib; ctx->dir = opendir( ctx->dirname ); if( ctx->dir ) { name = find_next( out_attrib ); if( name ) ctx->in_use = TRUE; } } else { /* no pattern, use stat on single file */ if( !stat( filespec->data, &info ) ) { tmp_attrib = get_attrib( filespec->data, &info ); if( (tmp_attrib & ~attrib ) == 0 ) { name = strrchr( filespec->data, '/' ); if( !name ) name = filespec->data; else name++; *out_attrib = tmp_attrib; } } } } else { /* findnext */ if( ctx->in_use ) name = find_next( out_attrib ); } FB_STRLOCK(); /* store filename if found */ if( name ) { len = strlen( name ); res = fb_hStrAllocTemp_NoLock( NULL, len ); if( res ) fb_hStrCopy( res->data, name, len ); else res = &__fb_ctx.null_desc; } else { res = &__fb_ctx.null_desc; *out_attrib = 0; } fb_hStrDelTemp_NoLock( filespec ); FB_STRUNLOCK(); return res; }