ref: eb1032e367ec1aee3cf5e321c4112f97720f42ee
dir: /unix.c/
#include <stdio.h> #include <stdarg.h> #include <stdlib.h> #include <unistd.h> #include "unix.h" #include "util.h" Point Pt(int x, int y) { Point p = {x, y}; return p; } _Noreturn void sysfatal(char *fmt, ...) { va_list arg; va_start(arg, fmt); vfprintf(stderr, fmt, arg); fprintf(stderr, "\n"); va_end(arg); abort(); } _Noreturn void exits(char *s) { if(s == nil) exit(0); else fprintf(stderr, "%s", s); exit(127); } int eqpt(Point p, Point q) { return p.x == q.x && p.y == q.y; } int nrand(int n) { return rand() % n; } /* * i'm well aware of printf and it's friends * but i had to prefer one (Plan 9) interface over other one (POSIX/ANSI) */ int vsprint(char *out, char *fmt, va_list arg) { int n; n = vsprintf(out, fmt, arg); return n; } int sprint(char *out, char *fmt, ...) { int n; va_list arg; va_start(arg, fmt); n = vsprint(out, fmt, arg); va_end(arg); return n; } int vfprint(int fd, char *fmt, va_list arg) { char *s = (char*)emalloc(1024); int n; n = vsprint(s, fmt, arg); if(write(fd, s, n) < n) perror("couldn't write"); free(s); return n; } int fprint(int fd, char *fmt, ...) { int n; va_list arg; va_start(arg, fmt); n = vfprint(fd, fmt, arg); va_end(arg); return n; } int print(char *fmt, ...) { int n; va_list args; va_start(args, fmt); n = vfprint(1, fmt, args); va_end(args); return n; }