PageRenderTime 26ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 0ms

/src/atlas/dervish.c

http://sdssidl.googlecode.com/
C | 362 lines | 260 code | 56 blank | 46 comment | 38 complexity | 20242a9636194bbf0638fde3091b6cf0 MD5 | raw file
Possible License(s): GPL-2.0
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <stdarg.h>
  5. #include "dervish.h"
  6. #include "phConsts.h"
  7. /* E.S.S. So we can use the IDL_Message routine */
  8. #include "idl_export.h"
  9. /*****************************************************************************/
  10. /*
  11. * A routine to return this version of photo's name
  12. */
  13. const char *
  14. phPhotoVersion(void)
  15. {
  16. static const char version[] = "$Name: $";
  17. if(strlen(version) <= 9) {
  18. return("NOCVS");
  19. } else {
  20. return(version);
  21. }
  22. }
  23. /*****************************************************************************/
  24. /*
  25. * utilities that dervish usually provides
  26. */
  27. #if !defined(DERVISH_H) /* we haven't got the _real_ dervish */
  28. TYPE
  29. shTypeGetFromName(const char *name) /* NOTUSED */
  30. {
  31. return(UNKNOWN);
  32. }
  33. /*****************************************************************************/
  34. /* E.S.S. */
  35. /* Changed to use IDL_MESSAGE */
  36. void
  37. shError(char *fmt, ...)
  38. {
  39. va_list args;
  40. char buff[1000];
  41. int len;
  42. va_start(args,fmt);
  43. vsprintf(buff,fmt,args);
  44. va_end(args);
  45. if(buff[len = strlen(buff)] == '\n') {
  46. buff[len] = '\0';
  47. }
  48. IDL_Message(IDL_M_NAMED_GENERIC, IDL_MSG_INFO,
  49. buff);
  50. /*
  51. fprintf(stderr,"Error: %s\n",buff);
  52. fflush(stderr);
  53. */
  54. }
  55. /*****************************************************************************/
  56. /*
  57. * This is the same as shError for current purposes
  58. */
  59. void
  60. shErrStackPush(char *fmt, ...)
  61. {
  62. va_list args;
  63. char buff[1000];
  64. int len;
  65. va_start(args,fmt);
  66. vsprintf(buff,fmt,args);
  67. va_end(args);
  68. if(buff[len = strlen(buff)] == '\n') {
  69. buff[len] = '\0';
  70. }
  71. shErrStackPush("%s",buff);
  72. fprintf(stderr,"Error: %s\n",buff);
  73. fflush(stderr);
  74. }
  75. /*
  76. * and here's the fatal handler
  77. */
  78. void
  79. shFatal(char *fmt, ...)
  80. {
  81. va_list args;
  82. va_start(args,fmt);
  83. fprintf(stderr,"Fatal error: ");
  84. vfprintf(stderr,fmt,args);
  85. fprintf(stderr,"\n");
  86. fflush(stderr);
  87. va_end(args);
  88. abort();
  89. }
  90. /*****************************************************************************/
  91. /*
  92. * memory management
  93. */
  94. void *
  95. shMalloc(size_t n)
  96. {
  97. void *ptr = malloc(n);
  98. if(ptr == NULL) {
  99. shFatal("failed to allocate %ld bytes", (long)n);
  100. }
  101. return(ptr);
  102. }
  103. void *
  104. shRealloc(void *ptr, size_t n)
  105. {
  106. ptr = realloc(ptr, n);
  107. if(ptr == NULL) {
  108. shFatal("failed to reallocate %ld bytes", (long)n);
  109. }
  110. return(ptr);
  111. }
  112. void
  113. shFree(void *ptr)
  114. {
  115. free(ptr);
  116. }
  117. int
  118. p_shMemRefCntrGet(void *ptr) /* NOTUSED */
  119. {
  120. return(0);
  121. }
  122. void
  123. p_shMemRefCntrDecr(void *ptr) /* NOTUSED */
  124. {
  125. ;
  126. }
  127. /*****************************************************************************/
  128. /*
  129. * regions
  130. */
  131. REGION *
  132. shRegNew(const char *name, /* NOTUSED */
  133. int nrow,
  134. int ncol,
  135. int type)
  136. {
  137. int i;
  138. REGION *reg = shMalloc(sizeof(REGION));
  139. reg->type = type;
  140. reg->nrow = nrow; reg->ncol = ncol;
  141. reg->rows_u8 = NULL; reg->rows_s8 = NULL;
  142. reg->rows = reg->rows_u16 = NULL; reg->rows_s16 = NULL;
  143. reg->rows_u32 = NULL; reg->rows_s32 = NULL;
  144. reg->rows_fl32 = NULL;
  145. reg->mask = NULL;
  146. reg->row0 = reg->col0 = 0;
  147. switch (reg->type) {
  148. case TYPE_U16:
  149. reg->rows = reg->rows_u16 = shMalloc(nrow*sizeof(U16 *));
  150. reg->rows[0] = shMalloc(nrow*ncol*sizeof(U16));
  151. for(i = 1; i < nrow; i++) {
  152. reg->rows[i] = reg->rows[i - 1] + ncol;
  153. }
  154. break;
  155. case TYPE_FL32:
  156. reg->rows_fl32 = shMalloc(nrow*sizeof(FL32 *));
  157. reg->rows_fl32[0] = shMalloc(nrow*ncol*sizeof(FL32));
  158. for(i = 1; i < nrow; i++) {
  159. reg->rows_fl32[i] = reg->rows_fl32[i - 1] + ncol;
  160. }
  161. break;
  162. default:
  163. shFatal("Impossible type of REGION: %d", reg->type);
  164. break; /* NOTREACHED */
  165. }
  166. return(reg);
  167. }
  168. void
  169. shRegDel(REGION *reg)
  170. {
  171. if(reg == NULL) {
  172. return;
  173. }
  174. switch (reg->type) {
  175. case TYPE_U16:
  176. if(reg->rows != NULL) {
  177. shFree(reg->rows[0]);
  178. shFree(reg->rows);
  179. }
  180. break;
  181. case TYPE_FL32:
  182. if(reg->rows_fl32 != NULL) {
  183. shFree(reg->rows_fl32[0]);
  184. shFree(reg->rows_fl32);
  185. }
  186. break;
  187. default:
  188. shFatal("Impossible type of REGION: %d", reg->type);
  189. break; /* NOTREACHED */
  190. }
  191. shFree(reg);
  192. }
  193. /*****************************************************************************/
  194. /*
  195. * masks
  196. */
  197. MASK *
  198. shMaskNew(const char *name, /* NOTUSED */
  199. int nrow,
  200. int ncol)
  201. {
  202. int i;
  203. MASK *mask = shMalloc(sizeof(MASK));
  204. mask->rows = shMalloc(nrow*sizeof(unsigned char *));
  205. mask->rows[0] = shMalloc(nrow*ncol);
  206. mask->nrow = nrow; mask->ncol = ncol;
  207. mask->row0 = mask->col0 = 0;
  208. for(i = 1; i < nrow; i++) {
  209. mask->rows[i] = mask->rows[i - 1] + ncol;
  210. }
  211. return(mask);
  212. }
  213. void
  214. shMaskDel(MASK *mask)
  215. {
  216. if(mask != NULL) {
  217. if(mask->rows != NULL) {
  218. shFree(mask->rows[0]);
  219. shFree(mask->rows);
  220. }
  221. shFree(mask);
  222. }
  223. }
  224. void
  225. shMaskClear(MASK *mask)
  226. {
  227. int i;
  228. shAssert(mask != NULL && mask->rows != NULL && mask->rows[0] != NULL);
  229. shAssert(mask->nrow >= 1);
  230. for(i = 0; i < mask->ncol; i++) {
  231. mask->rows[0][i] = '\0';
  232. }
  233. for(i = 1; i < mask->nrow; i++) {
  234. memcpy(mask->rows[i], mask->rows[0], mask->ncol);
  235. }
  236. }
  237. /*****************************************************************************/
  238. /*
  239. * CHAINs
  240. */
  241. CHAIN *
  242. shChainNew(char *type) /* NOTUSED */
  243. {
  244. return(NULL);
  245. }
  246. void
  247. shChainDel(CHAIN *ch) /* NOTUSED */
  248. {
  249. ;
  250. }
  251. void
  252. shChainElementAddByPos(CHAIN *ch, /* NOTUSED */
  253. void *el, /* NOTUSED */
  254. char *type, /* NOTUSED */
  255. int w, /* NOTUSED */
  256. int how) /* NOTUSED */
  257. {
  258. ;
  259. }
  260. void *
  261. shChainElementGetByPos(const CHAIN *ch, /* NOTUSED */
  262. int el) /* NOTUSED */
  263. {
  264. return(NULL);
  265. }
  266. void *
  267. shChainElementRemByPos(const CHAIN *ch, /* NOTUSED */
  268. int el) /* NOTUSED */
  269. {
  270. return(NULL);
  271. }
  272. /*****************************************************************************/
  273. /*
  274. * Misc utilities
  275. */
  276. /*
  277. * Clear a REGION
  278. */
  279. int
  280. shRegClear(REGION *reg) /* region to clear */
  281. {
  282. int i;
  283. int ncol,nrow; /* unpacked from reg */
  284. shAssert(reg != NULL);
  285. ncol = reg->ncol;
  286. nrow = reg->nrow;
  287. switch (reg->type) {
  288. case TYPE_U16:
  289. for(i = 0;i < nrow;i++) {
  290. memset(reg->rows_u16[i],ncol*sizeof(U16), '\0');
  291. }
  292. shAssert(reg->rows_u16[0][0] == 0); /* check 0 is all-bits-0 */
  293. break;
  294. case TYPE_FL32:
  295. for(i = 0;i < nrow;i++) {
  296. memset(reg->rows_fl32[i],ncol*sizeof(FL32), '\0');
  297. }
  298. shAssert(reg->rows_fl32[0][0] == 0.0); /* check 0.0 is all-bits-0 */
  299. break;
  300. default:
  301. shFatal("shRegClear doesn't handle regions of type %d\n", reg->type);
  302. return(SH_GENERIC_ERROR); /* NOTREACHED */
  303. }
  304. return(SH_SUCCESS);
  305. }
  306. #endif