Explorar o código

LibC: Add vsnprintf(), snprintf(), execvp() and abs().

Andreas Kling %!s(int64=6) %!d(string=hai) anos
pai
achega
69a3aecf6b
Modificáronse 6 ficheiros con 41 adicións e 0 borrados
  1. 27 0
      LibC/stdio.cpp
  2. 2 0
      LibC/stdio.h
  3. 5 0
      LibC/stdlib.cpp
  4. 1 0
      LibC/stdlib.h
  5. 5 0
      LibC/unistd.cpp
  6. 1 0
      LibC/unistd.h

+ 27 - 0
LibC/stdio.cpp

@@ -296,6 +296,33 @@ int sprintf(char* buffer, const char* fmt, ...)
     return ret;
 }
 
+static size_t __vsnprintf_space_remaining;
+static void sized_buffer_putch(char*& bufptr, char ch)
+{
+    if (__vsnprintf_space_remaining) {
+        *bufptr++ = ch;
+        --__vsnprintf_space_remaining;
+    }
+}
+
+int vsnprintf(char* buffer, size_t size, const char* fmt, va_list ap)
+{
+    __vsnprintf_space_remaining = size;
+    int ret = printfInternal(sized_buffer_putch, buffer, fmt, ap);
+    buffer[ret] = '\0';
+    return ret;
+}
+
+int snprintf(char* buffer, size_t size, const char* fmt, ...)
+{
+    va_list ap;
+    va_start(ap, fmt);
+    int ret = vsnprintf(buffer, size, fmt, ap);
+    buffer[ret] = '\0';
+    va_end(ap);
+    return ret;
+}
+
 void perror(const char* s)
 {
     fprintf(stderr, "%s: %s\n", s, strerror(errno));

+ 2 - 0
LibC/stdio.h

@@ -52,10 +52,12 @@ size_t fread(void* ptr, size_t size, size_t nmemb, FILE*);
 size_t fwrite(const void* ptr, size_t size, size_t nmemb, FILE*);
 int vfprintf(FILE*, const char* fmt, va_list);
 int vsprintf(char* buffer, const char* fmt, va_list);
+int vsnprintf(char* buffer, size_t, const char* fmt, va_list);
 int fprintf(FILE*, const char* fmt, ...);
 int printf(const char* fmt, ...);
 int dbgprintf(const char* fmt, ...);
 int sprintf(char* buffer, const char* fmt, ...);
+int snprintf(char* buffer, size_t, const char* fmt, ...);
 int putchar(int ch);
 int putc(int ch, FILE*);
 int puts(const char*);

+ 5 - 0
LibC/stdlib.cpp

@@ -244,4 +244,9 @@ void srand(unsigned seed)
     s_next_rand = seed;
 }
 
+int abs(int i)
+{
+    return i < 0 ? -i : i;
+}
+
 }

+ 1 - 0
LibC/stdlib.h

@@ -20,6 +20,7 @@ void exit(int status) __NORETURN;
 void abort() __NORETURN;
 char* ptsname(int fd);
 int ptsname_r(int fd, char* buffer, size_t);
+int abs(int);
 
 #define RAND_MAX 32767
 int rand();

+ 5 - 0
LibC/unistd.cpp

@@ -24,6 +24,11 @@ int execve(const char* filename, const char** argv, const char** envp)
     __RETURN_WITH_ERRNO(rc, rc, -1);
 }
 
+int execvp(const char* filename, const char** argv)
+{
+    return execve(filename, argv, nullptr);
+}
+
 uid_t getuid()
 {
     return syscall(SC_getuid);

+ 1 - 0
LibC/unistd.h

@@ -11,6 +11,7 @@ extern char** environ;
 inline int getpagesize() { return 4096; }
 pid_t fork();
 int execve(const char* filename, const char** argv, const char** envp);
+int execvp(const char* filename, const char** argv);
 void sync();
 void _exit(int status);
 pid_t getsid(pid_t);