which included commits to RCS files with non-trunk default branches. git-svn-id: svn://10.65.10.50/trunk@1539 c028cbd2-c16b-5b4b-a496-9718f37d4682
		
			
				
	
	
		
			345 lines
		
	
	
		
			8.8 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			345 lines
		
	
	
		
			8.8 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
| /* u4name.c   (c)Copyright Sequiter Software Inc., 1990-1994.  All rights reserved.  */
 | |
| 
 | |
| /*************************************************************************************/
 | |
| /* Soragna 20 Giugno 1995. Modificate le funzioni che discriminavano tra UNIX e DOS!.*/ 
 | |
| /* In alcuni casi si eccedeva la dimensione delle stringhe di copia a causa della    */
 | |
| /* differenza tra / e \ che riscontrano queste funzioni. Siccome le applicazioni     */
 | |
| /* PR.A.S.S.I. non sono sensibili a tali differenze, e' meglio adeguare il qui       */
 | |
| /* presente file. Sostanzialmente tutti i controlli su / e \ vengono unificati.      */
 | |
| /*************************************************************************************/
 | |
| 
 | |
| #include "d4all.h"
 | |
| #ifndef S4UNIX
 | |
| #ifdef __TURBOC__
 | |
| #pragma hdrstop
 | |
| #endif
 | |
| #endif
 | |
| 
 | |
| void S4FUNCTION u4name_ext( char *name, int len_result, char *new_ext, int do_replace )
 | |
| {
 | |
|   int file_name_len, ext_pos, on_pos, ext_len ;
 | |
| 
 | |
|   char *ptr ;
 | |
| 
 | |
|   ptr = name + (int)strlen( name ) - 1 ;
 | |
|   while ( *ptr == ' ' )
 | |
|   {
 | |
|     *ptr = '\0' ;
 | |
|     ptr-- ;
 | |
|   }
 | |
| 
 | |
|   ext_pos = file_name_len = strlen( name ) ;
 | |
| 
 | |
|   for( on_pos = ext_pos-1 ;; on_pos-- )
 | |
|   {
 | |
|     if ( name[on_pos] == '.' )
 | |
|     {
 | |
|       ext_pos = on_pos ;
 | |
|       break ;
 | |
|     } 
 | |
|     /* Soragna 20 Giugno 1995. Questa discriminazione provoca danni.
 | |
|        #ifdef S4UNIX
 | |
|        if ( name[on_pos] == '/' )  break ;
 | |
|        #else
 | |
|        if ( name[on_pos] == '\\' )  break ;
 | |
|        #endif
 | |
|        */
 | |
|     if ( name[on_pos] == '/' || name[on_pos] == '\\' )  break ;
 | |
|     if ( on_pos == 0 )  break ;
 | |
|   }
 | |
| 
 | |
|   if ( file_name_len != ext_pos &&  !do_replace )
 | |
|   {
 | |
| #ifndef S4UNIX
 | |
|     c4upper( name ) ;
 | |
| #endif
 | |
|     return ;
 | |
|   }
 | |
| 
 | |
|   if ( *new_ext == '.' )
 | |
|     new_ext++ ;
 | |
|   ext_len = strlen( new_ext ) ;
 | |
| 
 | |
|   if ( ext_len > 3 )
 | |
|     ext_len = 3 ;
 | |
| 
 | |
| #ifdef S4DEBUG
 | |
|   if ( len_result <= ext_pos + ext_len + 1 )
 | |
|     e4severe( e4result, E4_U4NAME_EXT ) ;
 | |
| #endif
 | |
| 
 | |
|   name[ext_pos++] = '.' ;
 | |
|   strcpy( name + ext_pos, new_ext ) ;
 | |
| 
 | |
| #ifndef S4UNIX
 | |
|   c4upper(name) ;
 | |
| #endif
 | |
| }
 | |
| 
 | |
| void S4FUNCTION u4name_make( char *buf, int buf_len, char *default_drive, char *default_directory, char *file_name )
 | |
| {
 | |
|   int default_directory_len, pos ;
 | |
| 
 | |
|   pos = 0 ;
 | |
| 
 | |
|   if( file_name[1] != ':' )
 | |
|     if ( default_drive != 0 )
 | |
|       if ( strlen( default_drive ) == 2 )
 | |
|       {
 | |
|         memcpy( buf, default_drive, 2 ) ;
 | |
|         pos += 2 ;
 | |
|       }
 | |
| 
 | |
|   if ( default_directory != 0 )
 | |
|     default_directory_len = strlen( default_directory ) ;
 | |
|   else
 | |
|     default_directory_len = 0 ;
 | |
| 
 | |
|   /* Soragn 20 Giugno 1995. May cause improper assigns.
 | |
|      #ifdef S4UNIX
 | |
|      if ( file_name[0] != '/'  &&  default_directory_len > 0 )
 | |
|      #else
 | |
|      if ( file_name[0] != '\\'  &&  default_directory_len > 0 )
 | |
|      #endif
 | |
|      */
 | |
|   if ( (file_name[0] != '/' || file_name[0] != '\\') &&  default_directory_len > 0 )
 | |
|   {
 | |
|     if ( pos+2 >= buf_len )
 | |
|       return ;   
 | |
|     /* Soragna 20 Giugno 1995. Anche questo controllo deve essere cambiato 
 | |
|        #ifdef S4UNIX
 | |
|        buf[pos++] = '/' ;
 | |
|        if ( default_directory[0] == '/' )
 | |
|        #else
 | |
|        buf[pos++] = '\\' ;
 | |
|        if ( default_directory[0] == '\\' )
 | |
|        #endif
 | |
|        */
 | |
| #ifdef S4UNIX
 | |
|     buf[pos++] = '/' ;
 | |
| #else
 | |
|     buf[pos++] = '\\' ;
 | |
| #endif
 | |
|     if ( default_directory[0] == '/' || default_directory[0] == '\\' )
 | |
|       default_directory++ ;
 | |
| 
 | |
|     default_directory_len = strlen(default_directory) ;
 | |
| 
 | |
|     u4ncpy( buf+pos, default_directory, buf_len - pos ) ;
 | |
|     pos += default_directory_len ;
 | |
|   }
 | |
| 
 | |
|   if ( pos >= buf_len )
 | |
|     return ;
 | |
| 
 | |
|   if ( pos > 0 )
 | |
|   {
 | |
|     /* Soragna 20 Giugno 1995. Pure questo non sfugge.
 | |
|        #ifdef S4UNIX
 | |
|        if ( buf[pos-1] != '/' )
 | |
|        buf[pos++] = '/' ;
 | |
|        if ( file_name[0] == '/'  )
 | |
|        file_name++ ;
 | |
|        #else
 | |
|        if ( buf[pos-1] != '\\' )
 | |
|        buf[pos++] = '\\' ;
 | |
|        if ( file_name[0] == '\\'  )
 | |
|        file_name++ ;
 | |
|        #endif
 | |
|        */
 | |
|     if ( buf[pos-1] != '/' && buf[pos-1] != '\\' )
 | |
| #ifdef S4UNIX
 | |
|       buf[pos++] = '/' ;
 | |
| #else
 | |
|     buf[pos++] = '\\' ;
 | |
| #endif
 | |
|     if ( file_name[0] == '/' || file_name[0] == '\\'  )
 | |
|       file_name++ ;
 | |
|   }
 | |
| 
 | |
|   u4ncpy( buf+pos, file_name, buf_len-pos ) ;
 | |
| }
 | |
| 
 | |
| void  S4FUNCTION u4name_piece( char *result, int len_result, char *from, int give_path, int give_ext )
 | |
| {
 | |
|   unsigned name_pos, ext_pos, on_pos, pos, new_len, from_len ;
 | |
|   int are_past_ext ;
 | |
| 
 | |
|   name_pos = 0 ;
 | |
|   are_past_ext = 0 ;
 | |
|   ext_pos = from_len = strlen(from) ;
 | |
|   if ( ext_pos == 0 )
 | |
|   {
 | |
|     *result = 0 ;
 | |
|     return ;
 | |
|   }
 | |
| 
 | |
|   for( on_pos = ext_pos-1;; on_pos-- )
 | |
|   {
 | |
|     switch ( from[on_pos] )
 | |
|     {
 | |
|       /* 
 | |
|          Soragna 20 Giugno 1995. Questo era quello che faceva piu' danni.
 | |
|          #ifdef S4UNIX
 | |
|          case '/':
 | |
|          #else
 | |
|          case '\\':
 | |
|          #endif
 | |
|          */
 | |
|     case '/':
 | |
|     case '\\':
 | |
|     case ':':
 | |
|       if (name_pos == 0)  name_pos = on_pos + 1 ;
 | |
|       are_past_ext = 1 ;
 | |
|       break ;
 | |
| 
 | |
|     case '.':
 | |
|       if ( ! are_past_ext )
 | |
|       {
 | |
|         ext_pos = on_pos ;
 | |
|         are_past_ext = 1 ;
 | |
|       }
 | |
|       break ;
 | |
|     default:
 | |
|       break ;
 | |
|     }
 | |
| 
 | |
|     if ( on_pos == 0 )
 | |
|       break ;
 | |
|   }
 | |
| 
 | |
|   pos = 0 ;
 | |
|   new_len = from_len ;
 | |
|   if ( !give_path )
 | |
|   {
 | |
|     pos = name_pos ;
 | |
|     new_len -= name_pos ;
 | |
|   }
 | |
| 
 | |
|   if ( !give_ext )
 | |
|     new_len -= from_len - ext_pos ;
 | |
| 
 | |
| #ifdef S4DEBUG
 | |
|   if ( new_len >= (unsigned) len_result )
 | |
|     e4severe( e4result, E4_U4NAME_PIECE ) ;
 | |
| #endif
 | |
| 
 | |
|   memcpy( result, from+ pos, new_len ) ;
 | |
|   result[new_len] = 0 ;
 | |
| 
 | |
| #ifndef S4UNIX
 | |
|   c4upper(result) ;
 | |
| #endif
 | |
| }
 | |
| 
 | |
| /* u4name_char  Returns TRUE iff it is a valid dBase field or function name character */
 | |
| int S4FUNCTION u4name_char( unsigned char ch)
 | |
| {
 | |
|   return ( ch>='a' && ch<='z'  || ch>='A' && ch<='Z'  ||
 | |
| #ifdef S4MDX
 | |
|           ch>='0' && ch<='9'  || ch=='&' || ch=='@' ||
 | |
| #else
 | |
|           ch>='0' && ch<='9'  ||
 | |
| #endif
 | |
|           ch=='_'
 | |
|           /*            ch=='\\'  ||  ch=='.'  || ch=='_'  ||  ch==':' */
 | |
| #ifdef S4GERMAN
 | |
| #ifdef S4ANSI
 | |
|           || ch== 196  ||  ch== 214  || ch== 220  ||  ch== 223
 | |
|           || ch== 228  ||  ch== 246  || ch== 252
 | |
| #else
 | |
|           || ch== 129  ||  ch== 132  || ch== 142  ||  ch== 148
 | |
|           || ch== 153  ||  ch== 154  || ch== 225
 | |
| #endif
 | |
| #endif
 | |
| #ifdef S4FRENCH
 | |
| #ifdef S4ANSI
 | |
|           || ch== 192 || ch== 194 || ch== 206 || ch== 207
 | |
|           || ch== 212 || ch== 219 || ch== 224 || ch== 226
 | |
|           || ch== 238 || ch== 239 || ch== 244 || ch== 251
 | |
|           || (ch>= 199 && ch <= 203) || (ch >= 231 && ch <= 235)
 | |
| #else
 | |
|           || ch== 128 || ch== 130 || ch== 131 || ch== 133
 | |
|           || ch== 144 || ch== 147 || ch== 150 || (ch>= 135 && ch <= 140)
 | |
| #endif
 | |
| #endif
 | |
| #ifdef S4SWEDISH
 | |
| #ifdef S4ANSI
 | |
|           || ch== 196 || ch== 197 || ch== 198 || ch== 201
 | |
|           || ch== 214 || ch== 220 || ch== 228 || ch== 229
 | |
|           || ch== 230 || ch== 233 || ch== 246 || ch== 252 )
 | |
| #else
 | |
|     || ch== 129 || ch== 130 || ch== 132 || ch== 134
 | |
|       || ch== 148 || ch== 153 || ch== 154 || (ch>= 142 && ch <= 146)
 | |
| #endif
 | |
| #endif
 | |
| #ifdef S4FINNISH
 | |
| #ifdef S4ANSI
 | |
|         || ch== 196 || ch== 197 || ch== 198 || ch== 201
 | |
|           || ch== 214 || ch== 220 || ch== 228 || ch== 229
 | |
|             || ch== 230 || ch== 233 || ch== 246 || ch== 252 )
 | |
| #else
 | |
|   || ch== 129 || ch== 130 || ch== 132 || ch== 134
 | |
|   || ch== 148 || ch== 153 || ch== 154 || (ch>= 142 && ch <= 146)
 | |
| #endif
 | |
| #endif
 | |
| #ifdef S4NORWEGIAN
 | |
| #ifdef S4ANSI
 | |
|   || ch== 196 || ch== 197 || ch== 198 || ch== 201
 | |
|   || ch== 214 || ch== 220 || ch== 228 || ch== 229
 | |
|   || ch== 230 || ch== 233 || ch== 246 || ch== 252 )
 | |
| #else
 | |
|   || ch== 129 || ch== 130 || ch== 132 || ch== 134
 | |
|   || ch== 148 || ch== 153 || ch== 154 || (ch>= 142 && ch <= 146)
 | |
| #endif
 | |
| #endif
 | |
|   ) ;
 | |
| }
 | |
| 
 | |
| /* returns the length of the path in 'from', and copies the path in 'from' to result */
 | |
| int S4FUNCTION u4name_path( char *result, int len_result, char *from )
 | |
| {
 | |
|   int on_pos ;
 | |
| 
 | |
|   u4name_piece( result, len_result, from, 1, 0 ) ;
 | |
|   for( on_pos = 0 ; result[on_pos] != 0 ; on_pos++ ) ;
 | |
| 
 | |
|   for( ; on_pos >= 0 ; on_pos-- )
 | |
|     /* Soragna 20 Giugno 1995. Anche questo puo' causare gravi macelli.
 | |
|        #ifdef S4UNIX
 | |
|        if( result[on_pos] == '/' || result[on_pos] == ':' ) break ;   
 | |
|        #else
 | |
|        if( result[on_pos] == '\\' || result[on_pos] == ':' ) break ;   
 | |
|        #endif                                                              
 | |
|        */
 | |
|     if( result[on_pos] == '/' || result[on_pos] == '\\' || result[on_pos] == ':' ) break ;   /* end of path */
 | |
| 
 | |
|   if( on_pos < len_result )
 | |
|     result[++on_pos] = '\0' ;
 | |
|   return on_pos ;
 | |
| }
 | |
| 
 | |
| /* returns the length of the extension in 'from', and copies the extension in 'from' to 'result' */
 | |
| int S4FUNCTION u4name_ret_ext( char *result, int len_result, char *from )
 | |
| {
 | |
|   char on_pos, len, name[13] ;
 | |
| 
 | |
| #ifdef S4DEBUG
 | |
|   if ( result == 0 || len_result < 3 || from == 0 )
 | |
|     e4severe( e4parm, E4_U4NAME_RET_EXT ) ;
 | |
| #endif
 | |
| 
 | |
|   u4name_piece( name, 13, from, 0, 1 ) ;
 | |
| 
 | |
|   len = 0 ;
 | |
|   for( on_pos = 0 ; name[on_pos] != 0 ; on_pos++ )
 | |
|     if ( name[on_pos] == '.' )
 | |
|     {
 | |
|       for ( on_pos++ ; name[on_pos] != 0 && len_result-- > 0 ; on_pos++, len++ )
 | |
|         result[len] = name[on_pos] ;
 | |
|       break ;
 | |
|     }
 | |
| 
 | |
|   return len ;
 | |
| }
 |