- Timestamp:
- Nov 20, 2020, 12:18:00 AM (4 years ago)
- Location:
- trunk/libs/mini-libc
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/libs/mini-libc/Makefile
r661 r677 6 6 7 7 ifeq ($(ARCH_NAME),) 8 $(error Please define inARCH_NAME parameter in params-soft.mk!)8 $(error Please define ARCH_NAME parameter in params-soft.mk!) 9 9 endif 10 10 -
trunk/libs/mini-libc/stdio.c
r647 r677 35 35 //////////////////////////////////////////////////////////////////////////////////////// 36 36 37 // This user space array registers all FILE descriptors open by a given process 38 FILE open_file_array[MAX_OPEN_FILE_PER_PROCESS]; // array of open files structures 37 // This user space array registers all FILE descriptors that can be simultaneously 38 // open by a given process. The structure FILE is defined in the <stdio.h> file. 39 40 FILE open_file_array[MAX_OPEN_FILE_PER_PROCESS]; 39 41 40 42 //////////////////////////////////////////////////////////////////////////////////////// … … 139 141 break; 140 142 } 141 case ('x'): // 32 bits hexadecimal 142 case ('l'): // 64 bits hexadecimal 143 { 144 unsigned int imax; 145 unsigned long long val; 146 147 if ( *format == 'l' ) // 64 bits 148 { 149 val = va_arg( *args, unsigned long long); 150 imax = 16; 151 } 152 else // 32 bits 153 { 154 val = va_arg( *args, unsigned int); 155 imax = 8; 156 } 157 143 case ('x'): // up to 8 digits hexa after "0x" 144 case ('X'): // exactly 8 digits hexa after "0x" 145 { 146 unsigned int val = va_arg( *args , unsigned int ); 158 147 TO_STREAM( '0' ); 159 148 TO_STREAM( 'x' ); 160 161 for(i = 0; i < imax; i++)162 {163 buf[(imax-1) - i] = HexaTab[val % 16];164 if (!(val /= 16)) break;149 for(i = 0 ; i < 8 ; i++) 150 { 151 buf[7 - i] = HexaTab[val & 0xF]; 152 if( (*format == 'x') && ((val >> 4) == 0) ) break; 153 val = val >> 4; 165 154 } 166 155 len = i + 1; 167 pbuf = &buf[(imax-1) - i]; 156 pbuf = &buf[7 - i]; 157 break; 158 } 159 case ('l'): // up to 16 digits hexa after "0x" 160 case ('L'): // exactly 16 digits hexa after "0x" 161 { 162 unsigned long long val = ((unsigned long long)va_arg( *args, unsigned int)) | 163 ((unsigned long long)va_arg( *args, unsigned int) << 32); 164 TO_STREAM( '0' ); 165 TO_STREAM( 'x' ); 166 for(i = 0 ; i < 16 ; i++) 167 { 168 buf[15 - i] = HexaTab[val & 0xF]; 169 if( (*format == 'l') && ((val >> 4) == 0) ) break; 170 val = val >> 4; 171 } 172 len = i + 1; 173 pbuf = &buf[15 - i]; 168 174 break; 169 175 } 170 176 case ('s'): /* string */ 171 177 { 172 char * str = va_arg( *args, char* );178 char * str = va_arg( *args , char* ); 173 179 while (str[len]) { len++; } 174 180 pbuf = str; … … 272 278 format++; 273 279 274 // copy argument to string280 // copy argument sub-string to the string buffer 275 281 for( i = 0 ; i < len ; i++ ) 276 282 { … … 285 291 int printf( const char * format, ... ) 286 292 { 287 char 288 va_list 289 unsignedint count;293 char string[4096]; 294 va_list args; 295 int count; 290 296 291 297 va_start( args, format ); … … 293 299 va_end( args ); 294 300 295 if ( count == 0xFFFFFFFF)301 if ( count < 0 ) 296 302 { 297 303 display_string( "printf : xprintf failure" ); … … 329 335 const char * format, ... ) 330 336 { 331 va_list 332 unsignedint count;337 va_list args; 338 int count; 333 339 334 340 va_start( args, format ); … … 336 342 va_end( args ); 337 343 338 if( count < length ) string[count] = 0; 339 340 return count; 344 if( (count < 0) || (count == (int)length) ) // failure 345 { 346 return -1; 347 } 348 else // success 349 { 350 // add NUL character 351 string[count] = 0; 352 353 return count; 354 } 341 355 } // end snprintf() 356 357 358 359 342 360 343 361 //////////////////////////////////// … … 398 416 399 417 } // end fclose() 418 419 ////////////////////////// 420 int fgetc( FILE * stream ) 421 { 422 // check stream valid 423 if( stream->key != VALID_OPEN_FILE ) return EOF; 424 425 // get file descriptor from stream pointer 426 int fd = stream->fd; 427 428 char byte; 429 430 if ( read( fd , &byte , 1 ) != 1 ) return 0; 431 else return (int)byte; 432 433 } 434 435 ///////////////// 436 int fputc( int c, 437 FILE * stream) 438 { 439 // check stream valid 440 if( stream->key != VALID_OPEN_FILE ) return EOF; 441 442 // get file descriptor from stream pointer 443 int fd = stream->fd; 444 445 char byte = (char)c; 446 447 if( write( fd , &byte , 1 ) != 1 ) return 0; 448 else return c; 449 450 } 400 451 401 452 ////////////////////////////////////////// -
trunk/libs/mini-libc/stdio.h
r647 r677 27 27 /********************************************************************************************* 28 28 * This file defines the user level, TXT related <stdio> library. 29 * 29 30 * These functions call the read() and write() functions defined in the <unistd> library 30 31 * to access the TXT terminal. … … 38 39 /********************************************************************************************* 39 40 * This defines the user level FILE structure. 41 * The open_file_array[] of files is a global variable allocated in the <stdio.c> file 40 42 ********************************************************************************************/ 41 43 … … 64 66 65 67 /********************************************************************************************* 66 * This function writes one singlecharacter to the standard "stdout" stream.68 * This function writes the <c> character to the standard "stdout" stream. 67 69 ********************************************************************************************* 68 70 * @ returns written character code if success / returns 0 (EOF) if failure. … … 85 87 * @ length : max bumber of characters in target buffer. 86 88 * @ format : formated string. 87 * @ returns number of characters writtenif success / returns -1 if failure.89 * @ returns string length (not including NUL) if success / returns -1 if failure. 88 90 ********************************************************************************************/ 89 91 int snprintf( char * string, 90 92 unsigned int length, 91 93 const char * format, ... ); 94 95 96 97 98 92 99 93 100 /********************************************************************************************* … … 131 138 132 139 /********************************************************************************************* 140 * This function returns one single character from the FILE identified by <stream>. 141 ********************************************************************************************* 142 * @ returns read character code if success / returns 0 (EOF) if failure. 143 ********************************************************************************************/ 144 int fgetc( FILE * stream ); 145 146 /********************************************************************************************* 147 * This function writes the <c> character to the FILE identified by <stream>. 148 ********************************************************************************************* 149 * @ returns written character code if success / returns 0 (EOF) if failure. 150 ********************************************************************************************/ 151 int fputc( int c, 152 FILE * stream); 153 154 /********************************************************************************************* 133 155 * This function copies a formated string to an output stream identified by the <stream> 134 156 * argument. It can be a regular file or a character oriented output device. -
trunk/libs/mini-libc/string.h
r619 r677 2 2 * string.h - User level <string> library definition. 3 3 * 4 * Author Alain Greiner (2016,2017,2018 )4 * Author Alain Greiner (2016,2017,2018,2019?2020) 5 5 * 6 6 * Copyright (c) UPMC Sorbonne Universites -
trunk/libs/mini-libc/strings.h
r449 r677 2 2 * strings.h - User level <strings> library definition. 3 3 * 4 * Author Alain Greiner (2016,2017,2018 )4 * Author Alain Greiner (2016,2017,2018,2019,2020) 5 5 * 6 6 * Copyright (c) UPMC Sorbonne Universites -
trunk/libs/mini-libc/unistd.h
r650 r677 35 35 36 36 /***************************************************************************************** 37 * This function implements the "alarm"system call.38 * sets a timer to deliver the signal SIGALRM to the calling process,37 * This function implements the <alarm> system call. 38 * It sets a timer to deliver the signal SIGALRM to the calling process, 39 39 * after the specified number of seconds. 40 40 * If an alarm has already been set with alarm() but has not been delivered, … … 49 49 50 50 /***************************************************************************************** 51 * This function implements the "chdir"system call.51 * This function implements the <chdir> system call. 52 52 * It changes the current working directory in the reference process descriptor. 53 53 ***************************************************************************************** … … 58 58 59 59 /***************************************************************************************** 60 * This function implements the "close"system call.60 * This function implements the <close> system call. 61 61 * It releases the memory allocated for the file identified by the <fd> argument, 62 62 * and remove the fd array_entry in all process descriptor copies. … … 68 68 69 69 /***************************************************************************************** 70 * This function implement the "exec"system call.70 * This function implement the <exec> system call. 71 71 * It creates, in the same cluster as the calling thread, a new process descriptor, 72 72 * and a new associated main thread descriptor, executing a new memory image defined … … 78 78 * as defined by the <arv> argument, and the new process environment variables, 79 79 * as defined by the <envp> argument. 80 * TODO : the < argv> and <envp> arguments are not supported yet (bothmust be NULL).80 * TODO : the <envs> argument is not supported yet (must be NULL). 81 81 ***************************************************************************************** 82 82 * @ filename : string pointer on .elf filename (virtual pointer in user space) 83 * @ arg v : array of strings on process arguments (virtual pointers in user space)84 * @ env p : array of strings on environment variables (virtual pointers in user space)83 * @ args : array of pointers on process arguments (strings in user space) 84 * @ envs : array of pointers on environment variables (strings in user space) 85 85 * @ does not return if success / returns -1 if failure. 86 86 ****************************************************************************************/ 87 87 int execve( char * filename, 88 char ** arg v,89 char ** env p);90 91 /***************************************************************************************** 92 * This function implement the "fork"system call.88 char ** args, 89 char ** envs ); 90 91 /***************************************************************************************** 92 * This function implement the <fork> system call. 93 93 * The calling process descriptor (parent process), and the associated thread descriptor 94 94 * are replicated in a - likely - remote cluster, that becomes the new process owner. … … 106 106 107 107 /***************************************************************************************** 108 * This function implements the "fsync"system call.108 * This function implements the <fsync> system call. 109 109 * It causes all the modified data and attributes of file identified by the <fd> argument 110 110 * to be copied from the file mapper and file descriptor to the IOC device. … … 116 116 117 117 /***************************************************************************************** 118 * This function implements the "getcwd"system call.118 * This function implements the <getcwd> system call. 119 119 * It returns the pathname of the current working directory. 120 120 ***************************************************************************************** … … 127 127 128 128 /***************************************************************************************** 129 * This function implements the "getpid"system call.129 * This function implements the <getpid> system call. 130 130 * It returns the process identifier. 131 131 ***************************************************************************************** … … 135 135 136 136 /***************************************************************************************** 137 * This function implements the "isatty"system call.137 * This function implements the <isatty> system call. 138 138 * It test whether a file descriptor refers to a terminal. 139 139 ***************************************************************************************** … … 144 144 145 145 /***************************************************************************************** 146 * This function implements the "lseek"system call.146 * This function implements the <lseek> system call. 147 147 * It repositions the offset of the file descriptor identified by <fd>, 148 148 * according to the operation type defined by the <whence> argument. … … 158 158 159 159 /***************************************************************************************** 160 * This function implements the "pause"system call.160 * This function implements the <pause> system call. 161 161 * It stops the calling process until a signal is received. 162 162 ***************************************************************************************** … … 166 166 167 167 /***************************************************************************************** 168 * This function implements the "pipe"system call.168 * This function implements the <pipe> system call. 169 169 * It creates in the calling thread cluster an unnamed pipe, and two (read and write) 170 170 * file descriptors to access this pipe. The argument is a pointer a fd[] array. 171 * TODO not implemented yet... 172 ***************************************************************************************** 173 * @ fd[0] : [out] read only file descriptor index. 174 * @ fd[1] : [out] write only file descriptor index. 171 ***************************************************************************************** 172 * @ fd[0] : [out] buffer for read only file descriptor index. 173 * @ fd[1] : [out] buffer for write only file descriptor index. 175 174 * @ return 0 if success / return -1 if failure. 176 175 ****************************************************************************************/ … … 178 177 179 178 /***************************************************************************************** 180 * This function implements the "read"system call.179 * This function implements the <read> system call. 181 180 * It reads bytes from an open file identified by the <fd> file descriptor. 182 181 * This file can be a regular file or a character oriented device. 183 182 ***************************************************************************************** 184 * @ fd : openfile index in fd_array.183 * @ fd : file index in fd_array. 185 184 * @ buf : buffer virtual address in user space. 186 185 * @ count : number of bytes. … … 192 191 193 192 /***************************************************************************************** 194 * This function implements the "rmdir"system call.193 * This function implements the <rmdir> system call. 195 194 * It removes a directory file whose name is given by <pathname>. 196 195 * The directory must not contain any entries other than `.' and `..'. … … 202 201 203 202 /***************************************************************************************** 204 * This function implements the "sync"system call.203 * This function implements the <sync> system call. 205 204 * It forces all kernel mappers (file caches) to be copied to the IOC device. 206 205 ****************************************************************************************/ … … 208 207 209 208 /***************************************************************************************** 210 * This function implements the "unlink"system call.209 * This function implements the <unlink> system call. 211 210 * It removes a directory entry identified by the <pathname> from the parent directory, 212 211 * and decrement the link count of the file referenced by the link. … … 222 221 223 222 /***************************************************************************************** 224 * This function implements the "write"system call.223 * This function implements the <write> system call. 225 224 * It writes bytes to an open file identified by the <fd> file descriptor. 226 225 * This file can be a regular file or character oriented device. 227 226 ***************************************************************************************** 228 * @ fd : openfile index in fd_array.227 * @ fd : file index in fd_array. 229 228 * @ buf : buffer virtual address in user space. 230 229 * @ count : number of bytes.
Note: See TracChangeset
for help on using the changeset viewer.