Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // mystdio.c
- #include "mystdio.h"
- // Fungsi untuk membaca input dari terminal
- int __read__(char *buffer, int size)
- {
- int bytes_read;
- asm volatile(
- "movl $3, %%eax;" // syscall nomor 3 untuk read
- "movl $0, %%ebx;" // file descriptor 0 (stdin)
- "movl %1, %%ecx;" // alamat buffer
- "movl %2, %%edx;" // ukuran buffer
- "int $0x80;" // interrupt untuk memanggil syscall
- "movl %%eax, %0;" // simpan jumlah byte yang dibaca ke bytes_read
- : "=r"(bytes_read)
- : "m"(buffer), "r"(size) // Use "m" constraint for buffer
- : "%eax", "%ebx", "%ecx", "%edx");
- return bytes_read;
- }
- // Fungsi untuk menulis output ke terminal
- void __write__(const char *str, int length)
- {
- asm volatile(
- "movl $4, %%eax;" // syscall nomor 4 untuk write
- "movl $1, %%ebx;" // file descriptor 1 (stdout)
- "movl %0, %%ecx;" // alamat string
- "movl %1, %%edx;" // panjang string
- "int $0x80;" // interrupt untuk memanggil syscall
- :
- : "m"(str), "r"(length) // Use "m" constraint for str
- : "%eax", "%ebx", "%ecx", "%edx");
- }
- // Fungsi untuk mengonversi string ke integer
- int __atoi__(char *str)
- {
- int result = 0, sign = 1, i = 0;
- // Memeriksa tanda negatif
- if (str[0] == '-')
- {
- sign = -1;
- i++;
- }
- // Mengonversi setiap karakter menjadi integer
- for (; str[i] != '\0' && str[i] != '\n'; i++)
- {
- result = result * 10 + (str[i] - '0');
- }
- return sign * result;
- }
- // Fungsi untuk menampilkan output dengan spesifier format
- void myprintf(const char *format, ...)
- {
- char buffer[100]; // Buffer untuk menampung string hasil format
- int index = 0;
- const char **args = (const char **)&format + 1; // Pointer untuk argumen variabel
- // Proses format
- while (*format)
- {
- if (*format == '%')
- {
- format++; // Lewati '%'
- if (*format == 'd')
- { // Untuk integer
- int value_int = *(int *)*args; // Ambil integer dari argumen
- args++; // Pindah ke argumen berikutnya
- if (value_int < 0)
- {
- buffer[index++] = '-';
- value_int = -value_int;
- }
- int start = index;
- // Menyimpan angka ke dalam buffer
- do
- {
- buffer[index++] = (value_int % 10) + '0';
- value_int /= 10;
- } while (value_int > 0);
- // Balikkan angka
- for (int i = index - 1; i >= start; i--)
- {
- buffer[index++] = buffer[i];
- }
- }
- else if (*format == 's')
- { // Untuk string
- char *value_str = *(char **)args; // Ambil string dari argumen
- args++; // Pindah ke argumen berikutnya
- while (*value_str)
- {
- buffer[index++] = *value_str++;
- }
- }
- }
- else
- {
- buffer[index++] = *format; // Salin karakter biasa
- }
- format++;
- }
- buffer[index] = '\0'; // Menambahkan null terminator di akhir
- // Tulis output ke terminal
- __write__(buffer, index); // Mengirim buffer dan panjangnya
- }
- // Fungsi untuk membaca input dengan spesifier format
- void myscanf(const char *format, void *value) {
- char buffer[100]; // Buffer untuk menampung input
- int bytes = __read__(buffer, sizeof(buffer)); // Membaca input
- if (bytes > 0)
- {
- buffer[bytes] = '\0'; // Menambahkan null terminator pada akhir
- // Parsing format
- if (*format == '%')
- {
- format++; // Lewati '%'
- if (*format == 'd')
- { // Untuk integer
- *(int *)value = __atoi__(buffer);
- }
- else if (*format == 's')
- { // Untuk string
- // Salin buffer ke string hingga batas '\0' atau '\n'
- for (int i = 0; i < bytes && buffer[i] != '\0' && buffer[i] != '\n'; i++)
- {
- *((char *)value + i) = buffer[i]; // Salin karakter satu per satu
- }
- *((char *)value + bytes - 1) = '\0'; // Gantikan newline dengan null terminator
- }
- }
- }
- }
Add Comment
Please, Sign In to add comment