basyair07

mystdio.c

Oct 16th, 2024
42
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.58 KB | None | 0 0
  1. // mystdio.c
  2. #include "mystdio.h"
  3.  
  4. // Fungsi untuk membaca input dari terminal
  5. int __read__(char *buffer, int size)
  6. {
  7.     int bytes_read;
  8.     asm volatile(
  9.         "movl $3, %%eax;" // syscall nomor 3 untuk read
  10.         "movl $0, %%ebx;" // file descriptor 0 (stdin)
  11.         "movl %1, %%ecx;" // alamat buffer
  12.         "movl %2, %%edx;" // ukuran buffer
  13.         "int $0x80;"      // interrupt untuk memanggil syscall
  14.         "movl %%eax, %0;" // simpan jumlah byte yang dibaca ke bytes_read
  15.         : "=r"(bytes_read)
  16.         : "m"(buffer), "r"(size) // Use "m" constraint for buffer
  17.         : "%eax", "%ebx", "%ecx", "%edx");
  18.     return bytes_read;
  19. }
  20.  
  21. // Fungsi untuk menulis output ke terminal
  22. void __write__(const char *str, int length)
  23. {
  24.     asm volatile(
  25.         "movl $4, %%eax;" // syscall nomor 4 untuk write
  26.         "movl $1, %%ebx;" // file descriptor 1 (stdout)
  27.         "movl %0, %%ecx;" // alamat string
  28.         "movl %1, %%edx;" // panjang string
  29.         "int $0x80;"      // interrupt untuk memanggil syscall
  30.         :
  31.         : "m"(str), "r"(length) // Use "m" constraint for str
  32.         : "%eax", "%ebx", "%ecx", "%edx");
  33. }
  34.  
  35. // Fungsi untuk mengonversi string ke integer
  36. int __atoi__(char *str)
  37. {
  38.     int result = 0, sign = 1, i = 0;
  39.  
  40.     // Memeriksa tanda negatif
  41.     if (str[0] == '-')
  42.     {
  43.         sign = -1;
  44.         i++;
  45.     }
  46.  
  47.     // Mengonversi setiap karakter menjadi integer
  48.     for (; str[i] != '\0' && str[i] != '\n'; i++)
  49.     {
  50.         result = result * 10 + (str[i] - '0');
  51.     }
  52.  
  53.     return sign * result;
  54. }
  55.  
  56. // Fungsi untuk menampilkan output dengan spesifier format
  57. void myprintf(const char *format, ...)
  58. {
  59.     char buffer[100]; // Buffer untuk menampung string hasil format
  60.     int index = 0;
  61.     const char **args = (const char **)&format + 1; // Pointer untuk argumen variabel
  62.  
  63.     // Proses format
  64.     while (*format)
  65.     {
  66.         if (*format == '%')
  67.         {
  68.             format++; // Lewati '%'
  69.             if (*format == 'd')
  70.             {                                  // Untuk integer
  71.                 int value_int = *(int *)*args; // Ambil integer dari argumen
  72.                 args++;                        // Pindah ke argumen berikutnya
  73.                 if (value_int < 0)
  74.                 {
  75.                     buffer[index++] = '-';
  76.                     value_int = -value_int;
  77.                 }
  78.                 int start = index;
  79.  
  80.                 // Menyimpan angka ke dalam buffer
  81.                 do
  82.                 {
  83.                     buffer[index++] = (value_int % 10) + '0';
  84.                     value_int /= 10;
  85.                 } while (value_int > 0);
  86.  
  87.                 // Balikkan angka
  88.                 for (int i = index - 1; i >= start; i--)
  89.                 {
  90.                     buffer[index++] = buffer[i];
  91.                 }
  92.             }
  93.             else if (*format == 's')
  94.             {                                     // Untuk string
  95.                 char *value_str = *(char **)args; // Ambil string dari argumen
  96.                 args++;                           // Pindah ke argumen berikutnya
  97.                 while (*value_str)
  98.                 {
  99.                     buffer[index++] = *value_str++;
  100.                 }
  101.             }
  102.         }
  103.         else
  104.         {
  105.             buffer[index++] = *format; // Salin karakter biasa
  106.         }
  107.         format++;
  108.     }
  109.     buffer[index] = '\0'; // Menambahkan null terminator di akhir
  110.  
  111.     // Tulis output ke terminal
  112.     __write__(buffer, index); // Mengirim buffer dan panjangnya
  113. }
  114.  
  115. // Fungsi untuk membaca input dengan spesifier format
  116. void myscanf(const char *format, void *value) {
  117.     char buffer[100];                            // Buffer untuk menampung input
  118.     int bytes = __read__(buffer, sizeof(buffer)); // Membaca input
  119.  
  120.     if (bytes > 0)
  121.     {
  122.         buffer[bytes] = '\0'; // Menambahkan null terminator pada akhir
  123.  
  124.         // Parsing format
  125.         if (*format == '%')
  126.         {
  127.             format++; // Lewati '%'
  128.             if (*format == 'd')
  129.             { // Untuk integer
  130.                 *(int *)value = __atoi__(buffer);
  131.             }
  132.             else if (*format == 's')
  133.             { // Untuk string
  134.                 // Salin buffer ke string hingga batas '\0' atau '\n'
  135.                 for (int i = 0; i < bytes && buffer[i] != '\0' && buffer[i] != '\n'; i++)
  136.                 {
  137.                     *((char *)value + i) = buffer[i]; // Salin karakter satu per satu
  138.                 }
  139.                 *((char *)value + bytes - 1) = '\0'; // Gantikan newline dengan null terminator
  140.             }
  141.         }
  142.     }
  143. }
  144.  
Add Comment
Please, Sign In to add comment