ref: ed2752fe715680692023bbcaf85ddf03c2444c2c
dir: /misc.c/
#include <u.h> #include <libc.h> #include <bio.h> #include <ctype.h> extern Biobuf kbin; char* strtime(void) { static char buf[6]; Tm *tm; tm = localtime(time(nil)); sprint(buf, "%02d:%02d", tm->hour, tm->min); return buf; } char* strenttime(char **tzo) { static char buf[32]; Tm *tm; int n; long t; t = time(nil); tm = gmtime(t); n = sprint(buf, "%04d-%02d-%02dT%02d:%02d:%02dZ", tm->year+1900, tm->mon+1, tm->mday, tm->hour, tm->min, tm->sec); *tzo = &buf[n+1]; tm = localtime(t); sprint(*tzo, "%+03d:%02d", tm->tzoff/3600, abs(tm->tzoff/60)%60); return buf; } void cleaninput(int n) { static char d[] = {8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8}; while(n > 0) n -= write(1, d, sizeof(d) > n ? n : sizeof(d)); } void setlabel(char *label, char *prsuffix) { static char *oldlabel; int fd; if(oldlabel == nil){ oldlabel = mallocz(64, 1); fd = open("/dev/label", OREAD); read(fd, oldlabel, 63); close(fd); } fd = open("/dev/label", OWRITE); if(label != nil){ if(label[0] == 0){ fprint(fd, "xmpp"); print("no target\n"); }else{ fprint(fd, "%s", label); if(prsuffix != nil && prsuffix[0] != 0) print("←→ %s [%s]\n", label, prsuffix); else print("←→ %s\n", label); } }else fprint(fd, "%s", oldlabel); close(fd); } char* strstamp(char *v) { static char buf[32]; Tm utc, *tm; int i, len; len = strlen(v); for(i = 0; i < len && (isdigit(v[i]) || v[i] == '.') ; i++); if(i == len){ /* 1456830231.000345 this is Slack being a bag of shit */ tm = localtime(atol(v)); sprint(buf, "%02d:%02d", tm->hour, tm->min); return buf; } if(len < 17) /* can't parse, just use the current time */ return strtime(); /* 20130327T16:28:58 http://xmpp.org/extensions/xep-0091.html * or * 2016-02-25T10:00:15.400Z http://xmpp.org/extensions/xep-0203.html */ for(i = 0; i < len; i++) if(isdigit(v[i])) v[i] -= '0'; memset(&utc, 0, sizeof(utc)); utc.year = v[0]*1000+v[1]*100+v[2]*10+v[3] - 1900; if(v[4] == '-' && v[7] == '-'){ utc.mon = v[5]*10+v[6] - 1; utc.mday = v[8]*10+v[9]; i = 2; }else{ utc.mon = v[4]*10+v[5] - 1; utc.mday = v[6]*10+v[7]; i = 0; } utc.hour = v[9+i]*10+v[10+i]; utc.min = v[12+i]*10+v[13+i]; utc.zone[0] = 'G'; utc.zone[1] = 'M'; utc.zone[2] = 'T'; tm = localtime(tm2sec(&utc)); sprint(buf, "%04d/%02d/%02d %02d:%02d", tm->year+1900, tm->mon+1, tm->mday, tm->hour, tm->min); memmove(&utc, tm, sizeof(utc)); tm = localtime(time(nil)); if(tm->year != utc.year || tm->mon != utc.mon || tm->mday != utc.mday) return buf; return buf+11; } char * readlines(void) { char *str, *s; int len, catlen, total; str = strdup(""); len = total = 0; for(; s = Brdstr(&kbin, '\n', 0);){ catlen = strlen(s); total += utflen(s); str = realloc(str, len + catlen + 1); memcpy(&str[len], s, catlen + 1); free(s); len += catlen; if(len >= 2 && str[len-2] == '.' && (len < 3 || str[len-3] == '\n')){ str[len - (len > 2 ? 3 : 2)] = 0; break; } } cleaninput(total); return str; }