dutil.c
上传用户:knt0001
上传日期:2022-01-28
资源大小:264k
文件大小:5k
源码类别:

Email客户端

开发平台:

C/C++

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <math.h>
  5. #include <unistd.h>
  6. #include <pwd.h>
  7. #include <assert.h>
  8. #include <sys/types.h>
  9. #include <sys/stat.h>
  10. #include "dutil.h"
  11. /*
  12.  * Wrapper for malloc
  13.  */
  14. void *
  15. xmalloc(size_t size)
  16. {
  17. void *ret=NULL;
  18. if (size == 0) {
  19. fprintf(stderr, "Cannot allocate buffer of size 0.n");
  20. abort();
  21. }
  22. ret = malloc(size);
  23. if (!ret) {
  24. perror("dlib-xmalloc");
  25. abort();
  26. }
  27. memset(ret, '', size);
  28. return ret;
  29. }
  30. /*
  31.  * Wrapper for realloc
  32.  */
  33. void *
  34. xrealloc(void *ptr, size_t size)
  35. {
  36. void *ret = realloc(ptr, size);
  37. if (!ret) {
  38. perror("dlib-xrealloc");
  39. abort();
  40. }
  41. return ret;
  42. }
  43. /*
  44.  * Wrapper for strdup
  45.  */
  46. char *
  47. xstrdup(const char *str)
  48. {
  49. char *ret=NULL;
  50. if (str) {
  51. ret = strdup(str);
  52. if (!ret) {
  53. perror("dlib-xstrdup");
  54. abort();
  55. }
  56. }
  57. return ret;
  58. }
  59. /*
  60.  * Wrapper for free
  61.  */
  62. void 
  63. __xfree(void *ptr)
  64. {
  65. if (ptr) {
  66. free(ptr);
  67. }
  68. }
  69. /**
  70.  * Removes any occurance of the passed in items
  71.  *
  72.  * Params
  73.  * str - The string to implode
  74.  * items - Items to remove from string
  75.  *
  76.  * Returns
  77.  * The length of the new string
  78.  */
  79. size_t
  80. strstrip(char *str, char *items)
  81. {
  82. size_t newlen=0;
  83. size_t len=strlen(str);
  84. char *curr=str, *itemptr;
  85. /*
  86.  * Loop through the passed in string, if we find
  87.  * any occurance of the items passed in, cover it
  88.  * with the remaining portion of the string. This will
  89.  * always include the NUL character. If one of the not
  90.  * items is not found, then we'll just pass over it and
  91.  * allow it to remain in the string.
  92.  */
  93. while (*curr != '') {
  94. itemptr = items;
  95. while (*itemptr != '') {
  96. if (*curr == *itemptr) {
  97. memmove(curr, curr+1, len);
  98. break;
  99. }
  100. itemptr++;
  101. }
  102. // We went through the whole thing and didn't find anything.
  103. if (*itemptr == '') {
  104. curr++;
  105. newlen++;
  106. }
  107. len--;
  108. }
  109. return newlen;
  110. }
  111. /**
  112.  * Gets a sub string based upon a starting position
  113.  * and a length of the sub string you want. The start
  114.  * can be a negative number. If it is, it will wrap
  115.  * around to the end of the string. In other words,
  116.  * -1 is really str[len - 1].  
  117.  *
  118.  *  Params
  119.  *  str - The string to find the sub string in.
  120.  *  start - The starting position.
  121.  *  len - The length of the sub string.
  122.  *
  123.  *  Return
  124.  *  A malloc'd string which is the sub string.
  125.  */
  126. char *
  127. substr(const char *str, int start, size_t len)
  128. {
  129. size_t slen=0;
  130. char *ret=NULL;
  131. if (len == 0) {
  132. return NULL;
  133. }
  134. slen = strlen(str);
  135. ret = xmalloc(len + 1);
  136. /* A negative number means to wrap.
  137.  * So, if the string is "Dean" and the caller 
  138.  * specified the start pos as -1, the starting
  139.  * position is the letter 'n'. So, we need to
  140.  * get to that postion appropriately.
  141.  */
  142. if (start < 0) {
  143. start += slen;
  144. }
  145. /* Make sure we don't go past the end of the string. */
  146. if ((start+len) > slen) {
  147. len = slen - start;
  148. }
  149. memcpy(ret, str+start, len);
  150. return ret;
  151. }
  152. /**
  153.  * Return the next prime number out of the number from the
  154.  * input integer.
  155.  *
  156.  * Params
  157.  *  n - The number to find the next prime from
  158.  *
  159.  * Return
  160.  *  The next prime number of n
  161.  */
  162. int
  163. nextprime(int n)
  164. {
  165. int i, div, ceilsqrt = 0;
  166. int retval=0;
  167. for (;; n++) {
  168. ceilsqrt = ceil(sqrt(n));
  169. for (i = 2; i <= ceilsqrt; i++) {
  170. div = n / i;
  171. if (div * i == n) {
  172. retval = n;
  173. break;
  174. }
  175. }
  176. if (retval) {
  177. break;
  178. }
  179. }
  180. return retval;
  181. }
  182. /**
  183.  * Finds the first occurance of a character in a string and 
  184.  * returns the index to where it is.
  185.  */
  186. int
  187. strfind(const char *str, char ch)
  188. {
  189. int i;
  190. for (i=0; *str != ''; i++, str++) {
  191. if (*str == ch) {
  192. return i;
  193. }
  194. }
  195. return -1;
  196. }
  197. static void
  198. __strexplodeDestr(void *ptr)
  199. {
  200. xfree(ptr);
  201. }
  202. /**
  203.  * Takes a string and breaks it up based on a specific character
  204.  * and returns it in a dvector
  205.  */
  206. dvector
  207. explode(const char *str, const char *delim)
  208. {
  209. bool found=false;
  210. const char *ptr=str, *dtmp=NULL;
  211. dstrbuf *buf = dsbNew(100);
  212. dvector vec = dvCreate(5, __strexplodeDestr);
  213. while (*ptr != '') {
  214. dtmp = delim;
  215. while (*dtmp != '') {
  216. if (*ptr == *dtmp) {
  217. if (buf->len > 0) {
  218. dvAddItem(&vec, xstrdup(buf->str));
  219. dsbClear(buf);
  220. }
  221. found = true;
  222. break;
  223. }
  224. dtmp++;
  225. }
  226. if (!found) {
  227. dsbCatChar(buf, *ptr);
  228. } else {
  229. found = false;
  230. }
  231. ptr++;
  232. }
  233. /* Add the last element if there was one. */
  234. if (buf->len > 0) {
  235. dvAddItem(&vec, xstrdup(buf->str));
  236. }
  237. dsbDestroy(buf);
  238. return vec;
  239. }
  240. /**
  241.  * Takes a dvector and implodes it to a string based on a specific 
  242.  * character to delimit by.
  243.  * Returns a dstrbuf
  244.  */
  245. dstrbuf *
  246. implode(dvector vec, char delim)
  247. {
  248. dstrbuf *buf = dsbNew(100);
  249. size_t veclen = dvLength(vec);
  250. uint i=0;
  251. for (i=0; i < veclen; i++) {
  252. dsbCat(buf, vec[i]);
  253. if ((i+1) < veclen) {
  254. /* Only append a ',' if we're not at the end. */
  255. dsbCat(buf, &delim);
  256. }
  257. }
  258. return buf;
  259. }
  260. /**
  261.  * Removes the r and n at the end of the line provided.
  262.  * This gets rid of standards UNIX n line endings and 
  263.  * also DOS CRLF or rn line endings.
  264.  */
  265. void
  266. chomp(char *str)
  267. {
  268. char *cp;
  269. if (str && (cp = strrchr(str, 'n'))) {
  270. *cp = '';
  271. }
  272. if (str && (cp = strrchr(str, 'r'))) {
  273. *cp = '';
  274. }
  275. }
  276. /**
  277.  * Returns the size of a file.
  278.  */
  279. size_t
  280. filesize(const char *file)
  281. {
  282. struct stat sb;
  283. memset(&sb, 0, sizeof(struct stat));
  284. if (stat(file, &sb) < 0) {
  285. return -1;
  286. }
  287. return sb.st_size;
  288. }