📄 util.c
字号:
#include "a.h"void*emalloc(uint n){ void *v; v = mallocz(n, 1); if(v == nil) sysfatal("out of memory"); return v;}char*estrdup(char *s){ char *t; t = strdup(s); if(t == nil) sysfatal("out of memory"); return t;}Rune*erunestrdup(Rune *s){ Rune *t; t = emalloc(sizeof(Rune)*(runestrlen(s)+1)); if(t == nil) sysfatal("out of memory"); runestrcpy(t, s); return t;}void*erealloc(void *ov, uint n){ void *v; v = realloc(ov, n); if(v == nil) sysfatal("out of memory"); return v;}Rune*erunesmprint(char *fmt, ...){ Rune *s; va_list arg; va_start(arg, fmt); s = runevsmprint(fmt, arg); va_end(arg); if(s == nil) sysfatal("out of memory"); return s;}char*esmprint(char *fmt, ...){ char *s; va_list arg; va_start(arg, fmt); s = vsmprint(fmt, arg); va_end(arg); if(s == nil) sysfatal("out of memory"); return s;}voidwarn(char *fmt, ...){ va_list arg; fprint(2, "htmlroff: %L: "); va_start(arg, fmt); vfprint(2, fmt, arg); va_end(arg); fprint(2, "\n");}/* * For non-Unicode compilers, so we can say * L("asdf") and get a Rune string. Assumes strings * are identified by their pointers, so no mutable strings! */typedef struct Lhash Lhash;struct Lhash{ char *s; Lhash *next; Rune r[1];};static Lhash *hash[1127];Rune*L(char *s){ Rune *p; Lhash *l; uint h; h = (uintptr)s%nelem(hash); for(l=hash[h]; l; l=l->next) if(l->s == s) return l->r; l = emalloc(sizeof *l+(utflen(s)+1)*sizeof(Rune)); p = l->r; l->s = s; while(*s) s += chartorune(p++, s); *p = 0; l->next = hash[h]; hash[h] = l; return l->r;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -