Viewing: echo.c
📄 echo.c (Read Only) ⬅ To go back
/* AdrOS echo utility — POSIX-compatible */
#include <stdio.h>
#include <string.h>
#include <unistd.h>

int main(int argc, char** argv) {
    int nflag = 0;      /* -n: no trailing newline */
    int eflag = 0;      /* -e: interpret escape sequences */
    int i = 1;

    /* Parse flags */
    while (i < argc && argv[i][0] == '-' && argv[i][1] != '\0') {
        const char* f = argv[i] + 1;
        int valid = 1;
        int n = 0, e = 0;
        while (*f) {
            if (*f == 'n') n = 1;
            else if (*f == 'e') e = 1;
            else if (*f == 'E') { /* no escapes — default */ }
            else { valid = 0; break; }
            f++;
        }
        if (!valid) break;
        if (n) nflag = 1;
        if (e) eflag = 1;
        i++;
    }

    int first = 1;
    for (; i < argc; i++) {
        if (!first)
            write(STDOUT_FILENO, " ", 1);
        first = 0;

        const char* s = argv[i];
        if (eflag) {
            while (*s) {
                if (*s == '\\' && s[1]) {
                    s++;
                    char c = *s;
                    switch (c) {
                    case 'n': write(STDOUT_FILENO, "\n", 1); break;
                    case 't': write(STDOUT_FILENO, "\t", 1); break;
                    case '\\': write(STDOUT_FILENO, "\\", 1); break;
                    case 'r': write(STDOUT_FILENO, "\r", 1); break;
                    case 'a': write(STDOUT_FILENO, "\a", 1); break;
                    default: write(STDOUT_FILENO, "\\", 1);
                             write(STDOUT_FILENO, &c, 1); break;
                    }
                } else {
                    write(STDOUT_FILENO, s, 1);
                }
                s++;
            }
        } else {
            write(STDOUT_FILENO, s, strlen(s));
        }
    }

    if (!nflag)
        write(STDOUT_FILENO, "\n", 1);

    return 0;
}