mapcalc.c 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. #include <stdlib.h>
  2. #include <string.h>
  3. #include <grass/gis.h>
  4. #include "list.h"
  5. #include "mapcalc.h"
  6. #include "number.h"
  7. #include "map.h"
  8. #include "plugin.h"
  9. #include "vector.h"
  10. #include "any.h"
  11. extern int yyparse(void); /* v.mapcalc.y */
  12. void freesym(const void *elt);
  13. SYMBOL *delsym(SYMBOL * head);
  14. int cmpsymname(const void *data, const void *elt);
  15. int cmpsymsym(const void *A, const void *B);
  16. void symcpy(const void *Dst, const void *Src);
  17. SYMBOL *getsym(const char *name);
  18. SYMBOL *putsym(const char *name);
  19. SYMBOL *argapp(SYMBOL * head, SYMBOL * arg);
  20. int main(int argc, char **argv);
  21. SYMBOL *symtab = NULL;
  22. int parseerror = 0;
  23. void freesym(const void *elt)
  24. {
  25. SYMBOL *sym;
  26. sym = (SYMBOL *) elt;
  27. if (sym->name)
  28. G_free(sym->name);
  29. if (sym->proto)
  30. G_free(sym->proto);
  31. if (sym->itype == st_pnt) {
  32. VECTOR *vec, *next;
  33. for (vec = (VECTOR *) sym->v.p; vec;) {
  34. next = vec->next;
  35. if (--vec->refcnt < 1)
  36. G_free(vec);
  37. vec = next;
  38. }
  39. }
  40. else if (sym->itype == st_map) {
  41. MAP *map, *next;
  42. for (map = (MAP *) sym->v.p; map;) {
  43. next = map->next;
  44. if (--map->refcnt < 1)
  45. G_free(map); /* more needs to be done! */
  46. map = next;
  47. }
  48. }
  49. else if (sym->itype == st_any) {
  50. ANY *any, *next;
  51. for (any = (ANY *) sym->v.p; any;) {
  52. next = any->next;
  53. if (--any->refcnt < 1)
  54. G_free(any);
  55. any = next;
  56. }
  57. }
  58. else if (sym->itype == st_str && sym->v.p)
  59. G_free(sym->v.p);
  60. }
  61. SYMBOL *delsym(SYMBOL * head)
  62. {
  63. return (SYMBOL *) listdelall((LIST *) head, freesym);
  64. }
  65. int cmpsymname(const void *data, const void *elt)
  66. {
  67. SYMBOL *sym;
  68. const char *name;
  69. sym = (SYMBOL *) elt;
  70. name = (const char *)data;
  71. return strcmp(name, sym->name);
  72. }
  73. int cmpsymsym(const void *A, const void *B)
  74. {
  75. SYMBOL *a, *b;
  76. a = (SYMBOL *) A;
  77. b = (SYMBOL *) B;
  78. return strcmp(b->name, a->name);
  79. }
  80. void symcpy(const void *Dst, const void *Src)
  81. {
  82. SYMBOL *dst, *src;
  83. dst = (SYMBOL *) Dst;
  84. src = (SYMBOL *) Src;
  85. dst->type = src->type;
  86. dst->itype = src->itype;
  87. dst->rettype = src->rettype;
  88. if (src->name)
  89. dst->name = strdup(src->name);
  90. if (src->proto)
  91. dst->proto = strdup(src->proto);
  92. if (src->itype == st_str && src->v.p)
  93. dst->v.p = strdup(src->v.p);
  94. else {
  95. if (src->itype == st_pnt)
  96. ((VECTOR *) src->v.p)->refcnt++;
  97. else if (src->itype == st_map)
  98. ((MAP *) src->v.p)->refcnt++;
  99. else if (src->itype == st_any)
  100. ((ANY *) src->v.p)->refcnt++;
  101. memcpy(&dst->v, &src->v, sizeof(src->v));
  102. }
  103. }
  104. SYMBOL *getsym(const char *name)
  105. {
  106. return (SYMBOL *) listbsearchdatum((LIST *) symtab, name, cmpsymname);
  107. }
  108. SYMBOL *putsym(const char *name)
  109. {
  110. SYMBOL *sym;
  111. sym = getsym(name);
  112. if (sym) {
  113. symtab = (SYMBOL *) listunlink((LIST *) symtab, (LIST *) sym);
  114. freesym(sym);
  115. }
  116. else
  117. sym = (SYMBOL *) listitem(sizeof(SYMBOL));
  118. sym->name = strdup(name);
  119. symtab = (SYMBOL *) listadd((LIST *) symtab, (LIST *) sym, cmpsymsym);
  120. return sym;
  121. }
  122. SYMBOL *argapp(SYMBOL * head, SYMBOL * arg)
  123. {
  124. return (SYMBOL *) listapp((LIST *) head, (LIST *) arg);
  125. }
  126. int main(int argc, char **argv)
  127. {
  128. init_num();
  129. init_map();
  130. init_plug();
  131. init_vec();
  132. init_any();
  133. yyparse();
  134. exit(0);
  135. }