wf.c
资源名称:c.rar [点击查看]
上传用户:shmaik
上传日期:2014-06-01
资源大小:45093k
文件大小:2k
源码类别:

VC书籍

开发平台:

C/C++

  1. static char rcsid[] = "$Id: H:/drh/idioms/book/RCS/table.doc,v 1.13 1997/10/27 23:10:11 drh Exp $";
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <errno.h>
  5. #include <ctype.h>
  6. #include "atom.h"
  7. #include "table.h"
  8. #include "mem.h"
  9. #include "getword.h"
  10. #include <string.h>
  11. void wf(char *, FILE *);
  12. int first(int c);
  13. int rest (int c);
  14. int compare(const void *x, const void *y);
  15. void vfree(const void *, void **, void *);
  16. int main(int argc, char *argv[]) {
  17. int i;
  18. for (i = 1; i < argc; i++) {
  19. FILE *fp = fopen(argv[i], "r");
  20. if (fp == NULL) {
  21. fprintf(stderr, "%s: can't open '%s' (%s)n",
  22. argv[0], argv[i], strerror(errno));
  23. return EXIT_FAILURE;
  24. } else {
  25. wf(argv[i], fp);
  26. fclose(fp);
  27. }
  28. }
  29. if (argc == 1) wf(NULL, stdin);
  30. return EXIT_SUCCESS;
  31. }
  32. void wf(char *name, FILE *fp) {
  33. Table_T table = Table_new(0, NULL, NULL);
  34. char buf[128];
  35. while (getword(fp, buf, sizeof buf, first, rest)) {
  36. const char *word;
  37. int i, *count;
  38. for (i = 0; buf[i] != ''; i++)
  39. buf[i] = tolower(buf[i]);
  40. word = Atom_string(buf);
  41. count = Table_get(table, word);
  42. if (count)
  43. (*count)++;
  44. else {
  45. NEW(count);
  46. *count = 1;
  47. Table_put(table, word, count);
  48. }
  49. }
  50. if (name)
  51. printf("%s:n", name);
  52. { int i;
  53.   void **array = Table_toArray(table, NULL);
  54.   qsort(array, Table_length(table), 2*sizeof (*array),
  55.    compare);
  56.   for (i = 0; array[i]; i += 2)
  57.    printf("%dt%sn", *(int *)array[i+1],
  58.    (char *)array[i]);
  59.   FREE(array); }
  60. Table_map(table, vfree, NULL);
  61. Table_free(&table);
  62. }
  63. int first(int c) {
  64. return isalpha(c);
  65. }
  66. int rest(int c) {
  67. return isalpha(c) || c == '_';
  68. }
  69. int compare(const void *x, const void *y) {
  70. return strcmp(*(char **)x, *(char **)y);
  71. }
  72. void vfree(const void *key, void **count, void *cl) {
  73. FREE(*count);
  74. }