2 AcessOS Basic C Library
\r
5 #include <acess/sys.h>
\r
10 #include "stdio_int.h"
\r
12 #define DEBUG_BUILD 0
\r
14 // === CONSTANTS ===
\r
18 // === PROTOTYPES ===
\r
19 EXPORT void itoa(char *buf, unsigned long num, int base, int minLength, char pad);
\r
20 struct sFILE *get_file_struct();
\r
23 struct sFILE _iob[STDIO_MAX_STREAMS]; // IO Buffer
\r
24 struct sFILE *stdin = &_iob[0]; // Standard Input
\r
25 struct sFILE *stdout = &_iob[1]; // Standard Output
\r
26 struct sFILE *stderr = &_iob[2]; // Standard Error
\r
30 * \fn FILE *freopen(FILE *fp, char *file, char *mode)
\r
32 EXPORT FILE *freopen(FILE *fp, char *file, char *mode)
\r
37 // Sanity Check Arguments
\r
38 if(!fp || !file || !mode) return NULL;
\r
48 case 'r': fp->Flags = FILE_FLAG_MODE_READ; break;
\r
49 case 'w': fp->Flags = FILE_FLAG_MODE_WRITE; break;
\r
50 case 'a': fp->Flags = FILE_FLAG_MODE_APPEND; break;
\r
51 case 'x': fp->Flags = FILE_FLAG_MODE_EXEC; break;
\r
56 for(i=1;mode[i];i++)
\r
60 case '+': fp->Flags |= FILE_FLAG_M_EXT;
\r
68 case 'r': openFlags = OPENFLAG_READ;
\r
69 if(fp->Flags & FILE_FLAG_M_EXT)
\r
70 openFlags |= OPENFLAG_WRITE;
\r
73 case 'w': openFlags = OPENFLAG_WRITE;
\r
74 if(fp->Flags & FILE_FLAG_M_EXT)
\r
75 openFlags |= OPENFLAG_READ;
\r
78 case 'x': openFlags = OPENFLAG_EXEC;
\r
83 fp->FD = reopen(fp->FD, file, openFlags);
\r
89 if(mode[0] == 'a') {
\r
90 seek(fp->FD, 0, SEEK_END); //SEEK_END
\r
96 \fn FILE *fopen(char *file, char *mode)
\r
97 \brief Opens a file and returns the pointer
\r
98 \param file String - Filename to open
\r
99 \param mode Mode to open in
\r
101 EXPORT FILE *fopen(char *file, char *mode)
\r
105 // Sanity Check Arguments
\r
106 if(!file || !mode) return NULL;
\r
108 // Create Return Structure
\r
109 retFile = get_file_struct();
\r
111 return freopen(retFile, file, mode);
\r
114 EXPORT void fclose(FILE *fp)
\r
120 EXPORT void fflush(FILE *fp)
\r
126 * \fn int fprintfv(FILE *fp, const char *format, va_list args)
\r
127 * \brief Print to a file from a variable argument list
\r
129 EXPORT int fprintfv(FILE *fp, const char *format, va_list args)
\r
131 va_list tmpList = args;
\r
135 if(!fp || !format) return -1;
\r
137 size = ssprintfv((char*)format, tmpList);
\r
139 buf = (char*)malloc(size+1);
\r
143 sprintfv(buf, (char*)format, args);
\r
146 write(fp->FD, size+1, buf);
\r
151 // Return written byte count
\r
156 * \fn int fprintf(FILE *fp, const char *format, ...)
\r
157 * \brief Print a formatted string to a stream
\r
159 EXPORT int fprintf(FILE *fp, const char *format, ...)
\r
165 va_start(args, format);
\r
166 ret = fprintfv(fp, (char*)format, args);
\r
174 EXPORT size_t fwrite(void *ptr, size_t size, size_t num, FILE *fp)
\r
177 if(!fp || !fp->FD) return -1;
\r
179 ret = write(fp->FD, size*num, ptr);
\r
185 * \fn EXPORT int fputc(int c, FILE *fp)
\r
186 * \brief Write a single character to the stream
\r
188 EXPORT int fputc(int c, FILE *fp)
\r
190 if(!fp || !fp->FD) return -1;
\r
191 return write(fp->FD, 1, &c);
\r
195 * \fn EXPORT int fgetc(FILE *fp)
\r
196 * \brief Read a character from the stream
\r
198 EXPORT int fgetc(FILE *fp)
\r
202 if(read(fp->FD, 1, &ret) == -1) return -1;
\r
206 // --- INTERNAL ---
\r
208 * \fn FILE *get_file_struct()
\r
209 * \brief Returns a file descriptor structure
\r
211 FILE *get_file_struct()
\r
214 for(i=0;i<STDIO_MAX_STREAMS;i++)
\r
216 if(_iob[i].Flags == 0) return &_iob[i];
\r
221 EXPORT int putchar(int ch)
\r
223 return write(_stdout, 1, (char*)&ch);
\r
226 EXPORT int puts(const char *str)
\r
233 len = write(_stdout, len, (char*)str);
\r
234 write(_stdout, 1, "\n");
\r
240 \fn EXPORT void sprintfv(char *buf, const char *format, va_list args)
\r
241 \brief Prints a formatted string to a buffer
\r
242 \param buf Pointer - Destination Buffer
\r
243 \param format String - Format String
\r
244 \param args VarArgs List - Arguments
\r
246 EXPORT void sprintfv(char *buf, const char *format, va_list args)
\r
249 int c, arg, minSize;
\r
256 while((c = *format++) != 0)
\r
258 //SysDebug("c = '%c'\n", c);
\r
277 if('1' <= c && c <= '9')
\r
279 while('0' <= c && c <= '9')
\r
282 minSize += c - '0';
\r
290 arg = va_arg(args, int);
\r
299 itoa(tmp, arg, 10, minSize, pad);
\r
303 itoa(tmp, arg, 10, minSize, pad);
\r
307 itoa(tmp, arg, 16, minSize, pad);
\r
311 itoa(tmp, arg, 8, minSize, pad);
\r
315 itoa(tmp, arg, 2, minSize, pad);
\r
322 if(!p) p = "(null)";
\r
323 while(*p) buf[pos++] = *p++;
\r
335 - Size, Stream, Print Formated, Variable Argument List
\r
338 \fn EXPORT int ssprintfv(char *format, va_list args)
\r
339 \brief Gets the total character count from a formatted string
\r
340 \param format String - Format String
\r
341 \param args VarArgs - Argument List
\r
343 EXPORT int ssprintfv(char *format, va_list args)
\r
346 int c, arg, minSize;
\r
353 while((c = *format++) != 0)
\r
375 if('1' <= c && c <= '9')
\r
377 while('0' <= c && c <= '9')
\r
380 minSize += c - '0';
\r
386 arg = va_arg(args, int);
\r
394 itoa(tmp, arg, 10, minSize, pad);
\r
397 itoa(tmp, arg, 10, minSize, pad);
\r
400 itoa(tmp, arg, 16, minSize, pad);
\r
403 itoa(tmp, arg, 8, minSize, pad);
\r
407 itoa(tmp, arg, 2, minSize, pad);
\r
413 if(!p) p = "(null)";
\r
414 while(*p) len++, p++;
\r
425 const char cUCDIGITS[] = "0123456789ABCDEF";
\r
427 * \fn static void itoa(char *buf, unsigned long num, int base, int minLength, char pad)
\r
428 * \brief Convert an integer into a character string
\r
430 EXPORT void itoa(char *buf, unsigned long num, int base, int minLength, char pad)
\r
441 while(num > base-1) {
\r
442 tmpBuf[pos] = cUCDIGITS[ num % base ];
\r
443 num = (long) num / base; //Shift {number} right 1 digit
\r
447 tmpBuf[pos++] = cUCDIGITS[ num % base ]; //Last digit of {number}
\r
450 while(minLength-- > 0) buf[i++] = pad;
\r
451 while(pos-- > 0) buf[i++] = tmpBuf[pos]; //Reverse the order of characters
\r
456 * \fn EXPORT int printf(const char *format, ...)
\r
457 * \brief Print a string to stdout
\r
459 EXPORT int printf(const char *format, ...)
\r
466 va_start(args, format);
\r
467 size = ssprintfv((char*)format, args);
\r
470 buf = (char*)malloc(size+1);
\r
473 va_start(args, format);
\r
474 sprintfv(buf, (char*)format, args);
\r
478 write(_stdout, size+1, buf);
\r
486 va_start(args, format);
\r
487 ret = fprintfv(stdout, (char*)format, args);
\r
493 * \fn EXPORT int sprintf(const char *buf, char *format, ...)
\r
494 * \brief Print a formatted string to a buffer
\r
496 EXPORT int sprintf(char *buf, const char *format, ...)
\r
499 va_start(args, format);
\r
500 sprintfv((char*)buf, (char*)format, args);
\r