gethead.c 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. #include <string.h>
  2. #include <ctype.h>
  3. #include <grass/gis.h>
  4. #include <grass/raster.h>
  5. #include "local_proto.h"
  6. #include <grass/glocale.h>
  7. static int scan_int(char *, void *, int);
  8. static int scan_res(char *, void *, int);
  9. static int scan_easting(char *, void *, int);
  10. static int scan_northing(char *, void *, int);
  11. static int scan_cellsize(char *, void *, int);
  12. static int extract(int, char *, char *, void *, int,
  13. int (*)(char *, void *, int));
  14. static int missing(int, char *);
  15. int gethead(FILE * fd, struct Cell_head *cellhd, int *missingval)
  16. {
  17. int i, ok;
  18. int nodata, res, s, w, r, c;
  19. char label[100], value[100];
  20. char buf[1024];
  21. s = nodata = res = w = r = c = 0;
  22. cellhd->zone = G_zone();
  23. cellhd->proj = G_projection();
  24. while (nodata == 0 || s == 0 || res == 0 || w == 0 || r == 0 || c == 0) {
  25. if (!G_getl2(buf, sizeof buf, fd))
  26. break;
  27. *label = *value = '\0';
  28. sscanf(buf, "%s %s", label, value);
  29. if (*label == '\0')
  30. continue; /* ignore blank lines */
  31. for (i = 0; i < strlen(label); i++) {
  32. label[i] = tolower(label[i]);
  33. }
  34. if (strcmp(label, "ncols") == 0) {
  35. if (!extract(c++, label, value, &cellhd->cols, cellhd->proj,
  36. scan_int))
  37. ok = 0;
  38. continue;
  39. }
  40. if (strcmp(label, "nrows") == 0) {
  41. if (!extract(r++, label, value, &cellhd->rows, cellhd->proj,
  42. scan_int))
  43. ok = 0;
  44. continue;
  45. }
  46. if (strcmp(label, "xllcorner") == 0) {
  47. if (!extract(w++, label, value, &cellhd->west, cellhd->proj,
  48. scan_easting))
  49. ok = 0;
  50. continue;
  51. }
  52. if (strcmp(label, "yllcorner") == 0) {
  53. if (!extract(s++, label, value, &cellhd->south, cellhd->proj,
  54. scan_northing))
  55. ok = 0;
  56. continue;
  57. }
  58. if (strcmp(label, "cellsize") == 0) {
  59. if (!extract(res++, label, value, &cellhd->ew_res, cellhd->proj,
  60. scan_cellsize))
  61. ok = 0;
  62. cellhd->ns_res = cellhd->ew_res;
  63. cellhd->north = cellhd->south + (cellhd->ns_res * cellhd->rows);
  64. cellhd->east = cellhd->west + (cellhd->ew_res * cellhd->cols);
  65. continue;
  66. }
  67. if (strcmp(label, "nodata_value") == 0) {
  68. if (!extract(nodata++, label, value, missingval, cellhd->proj,
  69. scan_res))
  70. ok = 0;
  71. continue;
  72. }
  73. G_warning(_("Illegal line in header"));
  74. G_warning(buf);
  75. missing(s, "yllcorner");
  76. missing(w, "xllcorner");
  77. missing(r, "nrows");
  78. missing(c, "ncols");
  79. missing(res, "cellsize");
  80. missing(nodata, "nodata_value");
  81. return 0;
  82. }
  83. G_adjust_Cell_head(cellhd, 1, 1);
  84. return 1;
  85. }
  86. static int scan_int(char *s, void *v, int proj)
  87. {
  88. char dummy[3];
  89. int *i = v;
  90. *dummy = 0;
  91. if (sscanf(s, "%d%1s", i, dummy) != 1)
  92. return 0;
  93. if (*dummy)
  94. return 0;
  95. if (*i <= 0)
  96. return 0;
  97. return 1;
  98. }
  99. static int scan_res(char *s, void *v, int proj)
  100. {
  101. char dummy[3];
  102. int *i = v;
  103. *dummy = 0;
  104. if (sscanf(s, "%d%1s", i, dummy) != 1)
  105. return 0;
  106. if (*dummy)
  107. return 0;
  108. if (*i <= -9999999)
  109. return 0;
  110. return 1;
  111. }
  112. static int scan_easting(char *s, void *v, int i)
  113. {
  114. return G_scan_easting(s, (double *)v, i);
  115. }
  116. static int scan_northing(char *s, void *v, int i)
  117. {
  118. return G_scan_northing(s, (double *)v, i);
  119. }
  120. static int scan_cellsize(char *s, void *v, int i)
  121. {
  122. return G_scan_resolution(s, (double *)v, i);
  123. }
  124. static int extract(int count, char *label, char *value,
  125. void *data, int proj, int (*scanner) (char *, void *, int))
  126. {
  127. if (count) {
  128. G_warning(_("Duplicate \"%s\" field in header"), label);
  129. return 0;
  130. }
  131. if (scanner(value, data, proj))
  132. return 1;
  133. G_warning(_("Illegal \"%s\" value in header: \"%s\""), label, value);
  134. return 0;
  135. }
  136. static int missing(int count, char *label)
  137. {
  138. if (count)
  139. return 0;
  140. G_warning(_("\"%s\" field missing from header"), label);
  141. return 1;
  142. }