util.c 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. #include "awiki.h"
  2. void*
  3. emalloc(uint n)
  4. {
  5. void *p;
  6. p = malloc(n);
  7. if(p == nil)
  8. error("can't malloc: %r");
  9. memset(p, 0, n);
  10. return p;
  11. }
  12. char*
  13. estrdup(char *s)
  14. {
  15. char *t;
  16. t = emalloc(strlen(s)+1);
  17. strcpy(t, s);
  18. return t;
  19. }
  20. char*
  21. estrstrdup(char *s, char *t)
  22. {
  23. char *u;
  24. u = emalloc(strlen(s)+strlen(t)+1);
  25. strcpy(u, s);
  26. strcat(u, t);
  27. return u;
  28. }
  29. char*
  30. eappend(char *s, char *sep, char *t)
  31. {
  32. char *u;
  33. if(t == nil)
  34. u = estrstrdup(s, sep);
  35. else{
  36. u = emalloc(strlen(s)+strlen(sep)+strlen(t)+1);
  37. strcpy(u, s);
  38. strcat(u, sep);
  39. strcat(u, t);
  40. }
  41. free(s);
  42. return u;
  43. }
  44. char*
  45. egrow(char *s, char *sep, char *t)
  46. {
  47. s = eappend(s, sep, t);
  48. free(t);
  49. return s;
  50. }
  51. void
  52. error(char *fmt, ...)
  53. {
  54. int n;
  55. va_list arg;
  56. char buf[256];
  57. fprint(2, "Wiki: ");
  58. va_start(arg, fmt);
  59. n = vseprint(buf, buf+sizeof buf, fmt, arg) - buf;
  60. va_end(arg);
  61. write(2, buf, n);
  62. write(2, "\n", 1);
  63. threadexitsall(fmt);
  64. }
  65. void
  66. ctlprint(int fd, char *fmt, ...)
  67. {
  68. int n;
  69. va_list arg;
  70. char buf[256];
  71. va_start(arg, fmt);
  72. n = vseprint(buf, buf+sizeof buf, fmt, arg) - buf;
  73. va_end(arg);
  74. if(write(fd, buf, n) != n)
  75. error("control file write(%s) error: %r", buf);
  76. }