bseg.c 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. #include <unistd.h>
  2. #include <fcntl.h>
  3. #include <grass/glocale.h>
  4. #include "seg.h"
  5. int bseg_open(BSEG *bseg, int srows, int scols, int nsegs_in_memory)
  6. {
  7. char *filename;
  8. int errflag;
  9. int fd;
  10. bseg->filename = NULL;
  11. bseg->fd = -1;
  12. bseg->name = NULL;
  13. bseg->mapset = NULL;
  14. filename = G_tempfile();
  15. if (-1 == (fd = creat(filename, 0666))) {
  16. G_warning(_("Unable to create segment file"));
  17. return -2;
  18. }
  19. if (0 > (errflag = Segment_format(fd, Rast_window_rows(),
  20. Rast_window_cols(), srows, scols,
  21. sizeof(char)))) {
  22. close(fd);
  23. unlink(filename);
  24. if (errflag == -1) {
  25. G_warning(_("Unable to write segment file"));
  26. return -1;
  27. }
  28. else {
  29. G_warning(_("Illegal configuration parameter(s)"));
  30. return -3;
  31. }
  32. }
  33. close(fd);
  34. if (-1 == (fd = open(filename, 2))) {
  35. unlink(filename);
  36. G_warning(_("Unable to re-open segment file"));
  37. return -4;
  38. }
  39. if (0 > (errflag = Segment_init(&(bseg->seg), fd, nsegs_in_memory))) {
  40. close(fd);
  41. unlink(filename);
  42. if (errflag == -1) {
  43. G_warning(_("Unable to read segment file"));
  44. return -5;
  45. }
  46. else {
  47. G_warning(_("Out of memory"));
  48. return -6;
  49. }
  50. }
  51. bseg->filename = filename;
  52. bseg->fd = fd;
  53. return 0;
  54. }
  55. int bseg_close(BSEG *bseg)
  56. {
  57. Segment_release(&(bseg->seg));
  58. close(bseg->fd);
  59. unlink(bseg->filename);
  60. if (bseg->name) {
  61. G_free(bseg->name);
  62. bseg->name = NULL;
  63. }
  64. if (bseg->mapset) {
  65. G_free(bseg->mapset);
  66. bseg->mapset = NULL;
  67. }
  68. return 0;
  69. }
  70. int bseg_put(BSEG *bseg, char *value, int row, int col)
  71. {
  72. if (Segment_put(&(bseg->seg), value, row, col) < 0) {
  73. G_warning(_("Unable to write segment file"));
  74. return -1;
  75. }
  76. return 0;
  77. }
  78. int bseg_put_row(BSEG *bseg, char *value, int row)
  79. {
  80. if (Segment_put_row(&(bseg->seg), value, row) < 0) {
  81. G_warning(_("Unable to write segment file"));
  82. return -1;
  83. }
  84. return 0;
  85. }
  86. int bseg_get(BSEG *bseg, char *value, int row, int col)
  87. {
  88. if (Segment_get(&(bseg->seg), value, row, col) < 0) {
  89. G_warning(_("Unable to read segment file"));
  90. return -1;
  91. }
  92. return 0;
  93. }
  94. int bseg_read_raster(BSEG *bseg, char *map_name, char *mapset)
  95. {
  96. int row, nrows;
  97. int col, ncols;
  98. int map_fd;
  99. CELL *buffer;
  100. char cbuf;
  101. bseg->name = NULL;
  102. bseg->mapset = NULL;
  103. map_fd = Rast_open_old(map_name, mapset);
  104. nrows = Rast_window_rows();
  105. ncols = Rast_window_cols();
  106. buffer = Rast_allocate_c_buf();
  107. for (row = 0; row < nrows; row++) {
  108. Rast_get_c_row(map_fd, buffer, row);
  109. for (col = ncols; col >= 0; col--) {
  110. cbuf = (char) buffer[col];
  111. bseg_put(bseg, &cbuf, row, col);
  112. }
  113. }
  114. Rast_close(map_fd);
  115. G_free(buffer);
  116. bseg->name = G_store(map_name);
  117. bseg->mapset = G_store(mapset);
  118. return 0;
  119. }
  120. int bseg_write_raster(BSEG *bseg, char *map_name)
  121. {
  122. int map_fd;
  123. int row, nrows;
  124. int col, ncols;
  125. CELL *buffer;
  126. char value;
  127. map_fd = Rast_open_c_new(map_name);
  128. nrows = Rast_window_rows();
  129. ncols = Rast_window_cols();
  130. buffer = Rast_allocate_c_buf();
  131. for (row = 0; row < nrows; row++) {
  132. G_percent(row, nrows, 1);
  133. for (col = 0; col < ncols; col++) {
  134. bseg_get(bseg, &value, row, col);
  135. buffer[col] = value;
  136. }
  137. Rast_put_row(map_fd, buffer, CELL_TYPE);
  138. }
  139. G_percent(row, nrows, 1); /* finish it */
  140. G_free(buffer);
  141. Rast_close(map_fd);
  142. return 0;
  143. }