routix.c

Go to the documentation of this file.
00001 /* routix.c */
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 //Entrega una pagina al espacio de usuario
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 int exec (char *tarea)
00102 {
00103      int retorno;
00104     _syscall1(SYS_PROCESS | SYS_EXEC, retorno, tarea);
00105 //      printf("Llamando a execve ...\n");
00106 //    return exec(tarea);
00107     return retorno;
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 // Funcion de libraria "putchar"
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 // llamada al sistema (similar a write pero hacia stdout)
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 // printf ( char *string, ...)  y funciones requeridas por ella
00256 //****************************************************************************************************
00257 
00258 //char getascii_ ( char c );
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;        // Posicion dentro de str donde se colocara el proximo dato     
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             //  case 'o':
00373                 //      i = va_arg(argumentos, unsigned int);
00374                 //      printn_s(i,8);
00375                 //      break; 
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 

Generated on Sun May 30 18:38:35 2004 for Routix OS by doxygen 1.3.6