util.c 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. #include <u.h>
  2. #include <libc.h>
  3. #include <bio.h>
  4. #include <libsec.h>
  5. #include <ctype.h>
  6. #include "iso9660.h"
  7. typedef struct Stringtab Stringtab;
  8. struct Stringtab {
  9. Stringtab *link;
  10. char *str;
  11. };
  12. static Stringtab *stab[1024];
  13. static uint
  14. hash(char *s)
  15. {
  16. uint h;
  17. uchar *p;
  18. h = 0;
  19. for(p=(uchar*)s; *p; p++)
  20. h = h*37 + *p;
  21. return h;
  22. }
  23. static char*
  24. estrdup(char *s)
  25. {
  26. if((s = strdup(s)) == nil)
  27. sysfatal("strdup(%.10s): out of memory", s);
  28. return s;
  29. }
  30. char*
  31. atom(char *str)
  32. {
  33. uint h;
  34. Stringtab *tab;
  35. h = hash(str) % nelem(stab);
  36. for(tab=stab[h]; tab; tab=tab->link)
  37. if(strcmp(str, tab->str) == 0)
  38. return tab->str;
  39. tab = emalloc(sizeof *tab);
  40. tab->str = estrdup(str);
  41. tab->link = stab[h];
  42. stab[h] = tab;
  43. return tab->str;
  44. }
  45. void*
  46. emalloc(ulong n)
  47. {
  48. void *p;
  49. if((p = malloc(n)) == nil)
  50. sysfatal("malloc(%lud): out of memory", n);
  51. memset(p, 0, n);
  52. return p;
  53. }
  54. void*
  55. erealloc(void *v, ulong n)
  56. {
  57. if((v = realloc(v, n)) == nil)
  58. sysfatal("realloc(%p, %lud): out of memory", v, n);
  59. return v;
  60. }
  61. char*
  62. struprcpy(char *p, char *s)
  63. {
  64. char *op;
  65. op = p;
  66. for(; *s; s++)
  67. *p++ = toupper(*s);
  68. *p = '\0';
  69. return op;
  70. }
  71. int
  72. chat(char *fmt, ...)
  73. {
  74. va_list arg;
  75. if(!chatty)
  76. return 0;
  77. va_start(arg, fmt);
  78. vfprint(2, fmt, arg);
  79. va_end(arg);
  80. return 1;
  81. }