00001
00002 #include "stdarg.h"
00003 #include <sys/types.h>
00004 #include <lib/routix.h>
00005 #include <stdio.h>
00006 #include <sys/syscalls.h>
00007 #include <string.h>
00008 #include <signal.h>
00009
00010 void sprintn ( unsigned int num, int base);
00011 void sputchar (char car);
00012 char getascii (char c);
00013
00014 int sleep(int segundos)
00015 {
00016 int retorno;
00017
00018 _syscall1( SYS_TIMER | SYS_SLEEP, retorno, segundos);
00019
00020 return retorno;
00021 }
00022
00023
00024 int usleep(int usegundos)
00025 {
00026 int retorno;
00027
00028 _syscall1( SYS_TIMER | SYS_USLEEP, retorno, usegundos);
00029
00030 return retorno;
00031 }
00032
00033
00034 int proc_dump(void)
00035 {
00036 int retorno;
00037
00038 _syscall0( SYS_TIMER | SYS_PROC_DUMP, retorno);
00039
00040 return retorno;
00041 }
00042
00043 int proc_dump_v(int pid)
00044 {
00045 int retorno;
00046
00047 _syscall1( SYS_TIMER | SYS_PROC_DUMP_V, retorno, pid);
00048
00049 return retorno;
00050 }
00051
00052 int timer_dump(void)
00053 {
00054 int retorno;
00055
00056 _syscall0( SYS_TIMER | SYS_TIMER_DUMP, retorno);
00057
00058 return retorno;
00059 }
00060
00061 int read_debug(int sector)
00062 {
00063 int retorno;
00064
00065 _syscall1( SYS_MISC | SYS_READ_DEBUG, retorno, sector);
00066
00067 return retorno;
00068 }
00069
00070
00071
00072 void *malloc_page(void)
00073 {
00074 void *retorno;
00075 _syscall0( SYS_MEM | SYS_MALLOC_PAGE, retorno);
00076 return retorno;
00077 }
00078
00079 int free_page(void *dir)
00080 {
00081 int retorno;
00082 _syscall1( SYS_MEM | SYS_FREE_PAGE, retorno, dir);
00083 return retorno;
00084 }
00085
00086 size_t free_mem(void)
00087 {
00088 size_t retorno;
00089 _syscall0( SYS_MEM | SYS_FREE_MEM, retorno);
00090 return retorno;
00091 }
00092
00093 void perror (char *str)
00094 {
00095 int retorno;
00096 _syscall1(SYS_PROCESS | SYS_PERROR, retorno, str);
00097 }
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111 int execve (char *tarea, char **argv, char **envp)
00112 {
00113 int retorno;
00114 _syscall3(SYS_PROCESS | SYS_EXECVE, retorno, tarea, argv, envp);
00115
00116 return retorno;
00117 }
00118
00119
00120
00121 void gets (char *str)
00122 {
00123 int retorno;
00124 _syscall1(SYS_CONSOLE | SYS_GETS, retorno, str);
00125 }
00126
00127 pid_t fork(void)
00128 {
00129 int retorno;
00130 _syscall0(SYS_PROCESS | SYS_FORK, retorno);
00131 return retorno;
00132 }
00133
00134
00135 void voido (void)
00136 {
00137 int retorno;
00138 _syscall0(SYS_PROCESS | SYS_VOID, retorno);
00139 }
00140
00141 int renice(word pid, word prioridad)
00142 {
00143 int retorno;
00144
00145 _syscall2( SYS_PROCESS | SYS_RENICE, retorno, pid, prioridad);
00146
00147 return retorno;
00148 }
00149
00150 pid_t getpid (void)
00151 {
00152 pid_t retorno;
00153 _syscall0( SYS_PROCESS | SYS_GETPID, retorno);
00154 return retorno;
00155 }
00156
00157 pid_t getppid (void)
00158 {
00159 pid_t retorno;
00160 _syscall0( SYS_PROCESS | SYS_GETPPID, retorno);
00161 return retorno;
00162 }
00163
00164 void exit(int valor)
00165 {
00166 int retorno;
00167 _syscall1(SYS_PROCESS | SYS_EXIT, retorno, valor);
00168 }
00169
00170 void show(int valor)
00171 {
00172 int retorno;
00173 _syscall1(SYS_PROCESS | SYS_SHOW, retorno, valor);
00174 }
00175
00176 pid_t wait(int *valor)
00177 {
00178 return waitpid(0, valor, 0);
00179 }
00180
00181 pid_t waitpid (pid_t pid, int *valor, int options)
00182 {
00183 int retorno;
00184 _syscall3(SYS_PROCESS | SYS_WAIT, retorno, pid, valor, options);
00185 return retorno;
00186 }
00187
00188 int kill(pid_t pid, int sig)
00189 {
00190 int retorno;
00191 _syscall2(SYS_SIGNALS | SYS_KILL, retorno, pid, sig);
00192 return retorno;
00193 }
00194
00195 void *signal (int signo, void (*func)() )
00196 {
00197 void *retorno;
00198 _syscall2(SYS_SIGNALS | SYS_SIGNAL, retorno, signo, func);
00199 return retorno;
00200 }
00201
00202 int sigaction (int signo, struct sigaction *act, struct sigaction *oact)
00203 {
00204 int retorno;
00205 _syscall3(SYS_SIGNALS | SYS_SIGACTION, retorno, signo, act, oact);
00206 return retorno;
00207 }
00208
00209
00210 void *signal_check ()
00211 {
00212 int retorno;
00213 _syscall0(SYS_SIGNALS | SYS_SIGNAL_CHECK, retorno);
00214 return retorno;
00215 }
00216
00217 int sigprocmask(int flag, const sigset_t *set, sigset_t *old_set)
00218 {
00219 int retorno;
00220 _syscall3(SYS_SIGNALS | SYS_SIGPROCMASK, retorno, flag, set, old_set);
00221 return retorno;
00222 }
00223
00224
00225 int putchar (char car)
00226 {
00227 char aux[2];
00228 aux[1]='\0';
00229 aux[0]=car;
00230 puts(aux);
00231 return 1;
00232 }
00233
00234
00235 void puts(char *str)
00236 {
00237 int retorno;
00238 _syscall2(SYS_CONSOLE | SYS_PRINT, retorno, str, strlen(str));
00239 }
00240
00241 int clrscr(void)
00242 {
00243 int retorno;
00244 _syscall0(SYS_CONSOLE | SYS_CLRSCR, retorno);
00245 return retorno;
00246 }
00247
00248 #define MAX_STRING 100
00249
00250 word sposicion=0;
00251
00252
00253
00254
00255
00256
00257
00258
00259 void printn_ ( unsigned int num, int base);
00260
00261 void printf ( char *string, ...)
00262 {
00263
00264 char *p=string;
00265 char *d;
00266 char car;
00267
00268 unsigned int i;
00269
00270 va_list argumentos;
00271
00272 va_start(argumentos, string );
00273
00274 for ( p=string; *p ; p++ ) {
00275 if ( *p != '%' ) {
00276 putchar(*p);
00277 continue;
00278 }
00279
00280 switch (*++p) {
00281
00282 case 'c':
00283 car=va_arg(argumentos, int);
00284 putchar( (char) car);
00285 break;
00286
00287 case 'x':
00288 i = va_arg(argumentos, unsigned int );
00289 printn_(i,16);
00290 break;
00291
00292 case 'd':
00293 i = va_arg(argumentos, int);
00294 if (i> (0xffffffff/2)) {
00295 putchar('-');
00296 printn_(~i+1,10);
00297 break;
00298 }
00299 printn_(i,10);
00300 break;
00301
00302 case 'u':
00303 i = va_arg(argumentos, unsigned int);
00304 printn_(i,10);
00305 break;
00306
00307 case 'o':
00308 i = va_arg(argumentos, unsigned int);
00309 printn_(i,8);
00310 break;
00311
00312 case 's':
00313 d = va_arg(argumentos, char *);
00314 puts(d);
00315 break;
00316
00317 default:
00318 putchar(*p);
00319 break;
00320 }
00321
00322 }
00323
00324 va_end(argumentos);
00325 }
00326
00327 void printn_s ( unsigned int num, int base, char *str, int *index);
00328
00329
00330 int sprintf(char *str, const char *string, ...)
00331 {
00332 char *p=(char *)string;
00333 char *d;
00334 char car;
00335
00336 unsigned int i;
00337 unsigned int index = 0;
00338
00339 va_list argumentos;
00340
00341 va_start(argumentos, string );
00342
00343 for ( p=(char *)string; *p ; p++ ) {
00344
00345 if ( *p != '%' ) {
00346 str[index++] = *p;
00347 continue;
00348 }
00349
00350 switch (*++p) {
00351 case 'c':
00352 car=va_arg(argumentos, int);
00353 str[index++] = car;
00354 break;
00355 case 'x':
00356 i = va_arg(argumentos, unsigned int );
00357 printn_s(i,16, str, &index);
00358 break;
00359 case 'd':
00360 i = va_arg(argumentos, int);
00361 if (i> (0xffffffff/2)) {
00362 str[index++] = '-';
00363 printn_s(~i+1,10, str, &index);
00364 break;
00365 }
00366 printn_s(i,10, str, &index);
00367 break;
00368 case 'u':
00369 i = va_arg(argumentos, unsigned int);
00370 printn_s(i,10, str, &index);
00371 break;
00372
00373
00374
00375
00376 case 's':
00377 d = va_arg(argumentos, char *);
00378 strcat(str+index, d);
00379 index += strlen(d);
00380 break;
00381 default:
00382 str[index++] = *p;
00383 break;
00384 }
00385
00386 }
00387
00388 str[index] = '\0';
00389 va_end(argumentos);
00390
00391 return index;
00392 }
00393
00394
00395 void printn_ ( unsigned int num, int base)
00396 {
00397 unsigned int div;
00398 if ( (div=num/base) ) printn_(div,base);
00399 putchar( getascii(num%base) );
00400 }
00401
00402 void printn_s ( unsigned int num, int base, char *str, int *index)
00403 {
00404 unsigned int div;
00405 if ( (div=num/base) )
00406 printn_s(div,base, str, index);
00407 str[(*index)++] = ( getascii(num%base) );
00408 }
00409
00410
00411 char getascii ( char c )
00412 {
00413 char valor = '0' + c;
00414
00415 if ( valor > '9' ) valor += 7;
00416 return valor;
00417 }
00418
00420 int setvar (char *nombre, int valor)
00421 {
00422 int retorno;
00423 _syscall2( SYS_MISC | SYS_SETVAR, retorno, nombre, valor);
00424 return retorno;
00425 }
00426
00427 int getvar (char *nombre)
00428 {
00429 int retorno;
00430 _syscall1( SYS_MISC | SYS_GETVAR, retorno, nombre);
00431 return retorno;
00432 }
00433