2 AcessOS Basic C Library
\r
5 #include <acess/sys.h>
\r
8 #include "stdio_int.h"
\r
10 #define DEBUG_BUILD 0
\r
12 // === CONSTANTS ===
\r
14 // === PROTOTYPES ===
\r
15 struct sFILE *get_file_struct();
\r
18 struct sFILE _iob[STDIO_MAX_STREAMS]; // IO Buffer
\r
22 * \fn FILE *freopen(FILE *fp, char *file, char *mode)
\r
24 FILE *freopen(FILE *fp, char *file, char *mode)
\r
29 // Sanity Check Arguments
\r
30 if(!fp || !file || !mode) return NULL;
\r
40 case 'r': fp->Flags = FILE_FLAG_MODE_READ; break;
\r
41 case 'w': fp->Flags = FILE_FLAG_MODE_WRITE; break;
\r
42 case 'a': fp->Flags = FILE_FLAG_MODE_APPEND; break;
\r
43 case 'x': fp->Flags = FILE_FLAG_MODE_EXEC; break;
\r
48 for(i=1;mode[i];i++)
\r
52 case '+': fp->Flags |= FILE_FLAG_M_EXT;
\r
60 case 'r': openFlags = OPENFLAG_READ;
\r
61 if(fp->Flags & FILE_FLAG_M_EXT)
\r
62 openFlags |= OPENFLAG_WRITE;
\r
65 case 'w': openFlags = OPENFLAG_WRITE;
\r
66 if(fp->Flags & FILE_FLAG_M_EXT)
\r
67 openFlags |= OPENFLAG_READ;
\r
70 case 'x': openFlags = OPENFLAG_EXEC;
\r
75 fp->FD = reopen(fp->FD, file, openFlags);
\r
81 if(mode[0] == 'a') {
\r
82 seek(fp->FD, 0, SEEK_END); //SEEK_END
\r
88 \fn FILE *fopen(char *file, char *mode)
\r
89 \brief Opens a file and returns the pointer
\r
90 \param file String - Filename to open
\r
91 \param mode Mode to open in
\r
93 FILE *fopen(char *file, char *mode)
\r
97 // Sanity Check Arguments
\r
98 if(!file || !mode) return NULL;
\r
100 // Create Return Structure
\r
101 retFile = get_file_struct();
\r
103 return freopen(retFile, file, mode);
\r
106 void fclose(FILE *fp)
\r
112 void fflush(FILE *fp)
\r
118 * \fn int fprintf(FILE *fp, const char *format, ...)
\r
119 * \brief Print a formatted string to a stream
\r
121 int fprintf(FILE *fp, const char *format, ...)
\r
127 if(!fp || !format) return -1;
\r
130 va_start(args, format);
\r
131 size = ssprintfv((char*)format, args);
\r
135 buf = (char*)malloc(size+1);
\r
139 va_start(args, format);
\r
140 sprintfv(buf, (char*)format, args);
\r
144 write(fp->FD, size+1, buf);
\r
149 // Return written byte count
\r
153 // --- INTERNAL ---
\r
155 * \fn FILE *get_file_struct()
\r
156 * \brief Returns a file descriptor structure
\r
158 FILE *get_file_struct()
\r
161 for(i=0;i<STDIO_MAX_STREAMS;i++)
\r
163 if(_iob[i].Flags == 0) return &_iob[i];
\r