/* * NetCosm - a MUD server * Copyright (C) 2016 Franklin Wei * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "globals.h" void __attribute__((noreturn)) error(const char *fmt, ...) { char buf[128]; memset(buf, 0, sizeof(buf)); va_list ap; va_start(ap, fmt); vsnprintf(buf, sizeof(buf), fmt, ap); va_end(ap); perror(buf); abort(); exit(EXIT_FAILURE); } void remove_cruft(char *str) { char *junk; strtok_r(str, "\r\n", &junk); } /** * WARNING: not signal-safe AT ALL * TODO: rewrite to avoid calling *printf() */ void debugf_real(const char *func, int line, const char *file, const char *fmt, ...) { (void) func; (void) line; (void) file; int len; va_list ap; va_start(ap, fmt); char *buf; len = vasprintf(&buf, fmt, ap); write(STDOUT_FILENO, buf, len); free(buf); va_end(ap); } void all_upper(char *s) { while(*s) { *s = toupper(*s); s++; } } void all_lower(char *s) { while(*s) { *s = tolower(*s); s++; } } void write_roomid(int fd, room_id *id) { write(fd, id, sizeof(*id)); } void write_string(int fd, const char *str) { size_t len = strlen(str); write(fd, &len, sizeof(len)); write(fd, str, len); } room_id read_roomid(int fd) { room_id ret; if(read(fd, &ret, sizeof(ret)) < 0) return ROOM_NONE; return ret; } char *read_string(int fd) { size_t sz; if(read(fd, &sz, sizeof(sz)) != sizeof(sz)) { error("read_string: EOF"); } char *ret = malloc(sz + 1); if((size_t)read(fd, ret, sz) != sz) { free(ret); error("read_string: EOF"); } ret[sz] = '\0'; return ret; } bool read_bool(int fd) { bool ret; if(read(fd, &ret, sizeof(ret)) != sizeof(ret)) error("unexpected EOF"); return ret; } void write_bool(int fd, bool b) { if(write(fd, &b, sizeof(b)) != sizeof(b)) error("write failed"); } uint32_t read_uint32(int fd) { uint32_t ret; if(read(fd, &ret, sizeof(ret)) != sizeof(ret)) error("unexpected EOF"); return ret; } void write_uint32(int fd, uint32_t b) { if(write(fd, &b, sizeof(b)) != sizeof(b)) error("write failed"); } uint64_t read_uint64(int fd) { uint64_t ret; if(read(fd, &ret, sizeof(ret)) != sizeof(ret)) error("unexpected EOF"); return ret; } void write_uint64(int fd, uint64_t b) { if(write(fd, &b, sizeof(b)) != sizeof(b)) error("write failed"); } size_t read_size(int fd) { size_t ret; if(read(fd, &ret, sizeof(ret)) != sizeof(ret)) error("unexpected EOF"); return ret; } void write_size(int fd, size_t b) { if(write(fd, &b, sizeof(b)) != sizeof(b)) error("write failed"); } bool is_vowel(char c) { switch(tolower(c)) { case 'a': case 'e': case 'i': case 'o': case 'u': return true; default: return false; } }