/hpic-0.52.2/src/hpic/hpic_keys.c

# · C · 579 lines · 529 code · 29 blank · 21 comment · 108 complexity · 7e2bf2c7de8964364a0ce33dccb9d111 MD5 · raw file

  1. /*****************************************************************************
  2. * Copyright 2003-2005 Theodore Kisner <kisner@physics.ucsb.edu> *
  3. * *
  4. * This program is free software; you can redistribute it and/or modify it *
  5. * under the terms of the GNU General Public License as published by the *
  6. * Free Software Foundation; either version 2 of the License, or (at your *
  7. * option) any later version. *
  8. * *
  9. * Please see the notice at the top of the hpic.h header file for *
  10. * additional copyright and warranty exclusion information. *
  11. * *
  12. * This code deals with the FITS keys structure *
  13. *****************************************************************************/
  14. #include <hpic.h>
  15. /* alloc/free */
  16. hpic_keys *hpic_keys_alloc()
  17. {
  18. hpic_keys *keys;
  19. keys = (hpic_keys *) calloc(1, sizeof(hpic_keys));
  20. if (!keys) {
  21. HPIC_ERROR_VAL(HPIC_ERR_ALLOC, "cannot allocate keys", NULL);
  22. }
  23. keys->nskeys = 0;
  24. keys->nikeys = 0;
  25. keys->nfkeys = 0;
  26. keys->skeynames = NULL;
  27. keys->skeyvals = NULL;
  28. keys->skeycoms = NULL;
  29. keys->ikeynames = NULL;
  30. keys->ikeyvals = NULL;
  31. keys->ikeycoms = NULL;
  32. keys->fkeynames = NULL;
  33. keys->fkeyvals = NULL;
  34. keys->fkeycoms = NULL;
  35. return keys;
  36. }
  37. int hpic_keys_free(hpic_keys * keys)
  38. {
  39. size_t i;
  40. if (keys) {
  41. for (i = 0; i < (keys->nskeys); i++) {
  42. free(keys->skeynames[i]);
  43. free(keys->skeyvals[i]);
  44. free(keys->skeycoms[i]);
  45. }
  46. if (keys->nskeys != 0) {
  47. free(keys->skeynames);
  48. free(keys->skeyvals);
  49. free(keys->skeycoms);
  50. }
  51. for (i = 0; i < (keys->nikeys); i++) {
  52. free(keys->ikeynames[i]);
  53. free(keys->ikeycoms[i]);
  54. }
  55. if (keys->nikeys != 0) {
  56. free(keys->ikeynames);
  57. free(keys->ikeyvals);
  58. free(keys->ikeycoms);
  59. }
  60. for (i = 0; i < (keys->nfkeys); i++) {
  61. free(keys->fkeynames[i]);
  62. free(keys->fkeycoms[i]);
  63. }
  64. if (keys->nfkeys != 0) {
  65. free(keys->fkeynames);
  66. free(keys->fkeyvals);
  67. free(keys->fkeycoms);
  68. }
  69. free(keys);
  70. return 0;
  71. } else {
  72. HPIC_ERROR(HPIC_ERR_FREE, "keys not allocated, so not freeing");
  73. }
  74. }
  75. int hpic_keys_clear(hpic_keys * keys)
  76. {
  77. size_t i;
  78. if (keys) {
  79. for (i = 0; i < (keys->nskeys); i++) {
  80. free(keys->skeynames[i]);
  81. free(keys->skeyvals[i]);
  82. free(keys->skeycoms[i]);
  83. }
  84. if (keys->nskeys != 0) {
  85. free(keys->skeynames);
  86. free(keys->skeyvals);
  87. free(keys->skeycoms);
  88. }
  89. for (i = 0; i < (keys->nikeys); i++) {
  90. free(keys->ikeynames[i]);
  91. free(keys->ikeycoms[i]);
  92. }
  93. if (keys->nikeys != 0) {
  94. free(keys->ikeynames);
  95. free(keys->ikeyvals);
  96. free(keys->ikeycoms);
  97. }
  98. for (i = 0; i < (keys->nfkeys); i++) {
  99. free(keys->fkeynames[i]);
  100. free(keys->fkeycoms[i]);
  101. }
  102. if (keys->nfkeys != 0) {
  103. free(keys->fkeynames);
  104. free(keys->fkeyvals);
  105. free(keys->fkeycoms);
  106. }
  107. keys->nskeys = 0;
  108. keys->nikeys = 0;
  109. keys->nfkeys = 0;
  110. keys->skeynames = NULL;
  111. keys->skeyvals = NULL;
  112. keys->skeycoms = NULL;
  113. keys->ikeynames = NULL;
  114. keys->ikeyvals = NULL;
  115. keys->ikeycoms = NULL;
  116. keys->fkeynames = NULL;
  117. keys->fkeyvals = NULL;
  118. keys->fkeycoms = NULL;
  119. return 0;
  120. } else {
  121. HPIC_ERROR(HPIC_ERR_FREE, "keys not allocated, so not freeing");
  122. }
  123. }
  124. /* add keys */
  125. int hpic_keys_sadd(hpic_keys * keys, char *keyname, char *keyval, char *keycom)
  126. {
  127. if (keys) {
  128. (keys->skeynames) =
  129. (char **)realloc(keys->skeynames,
  130. ((keys->nskeys) + 1) * sizeof(char *));
  131. if (!(keys->skeynames)) {
  132. HPIC_ERROR(HPIC_ERR_ALLOC, "cannot realloc skeynames");
  133. }
  134. (keys->skeynames[keys->nskeys]) =
  135. (char *)calloc(HPIC_STRNL, sizeof(char));
  136. if (!(keys->skeynames[keys->nskeys])) {
  137. HPIC_ERROR(HPIC_ERR_ALLOC, "cannot allocated appended skeyname");
  138. }
  139. (keys->skeyvals) =
  140. (char **)realloc(keys->skeyvals, ((keys->nskeys) + 1) * sizeof(char *));
  141. if (!(keys->skeyvals)) {
  142. HPIC_ERROR(HPIC_ERR_ALLOC, "cannot realloc skeyvals");
  143. }
  144. (keys->skeyvals[keys->nskeys]) = (char *)calloc(HPIC_STRNL, sizeof(char));
  145. if (!(keys->skeyvals[keys->nskeys])) {
  146. HPIC_ERROR(HPIC_ERR_ALLOC, "cannot allocated appended skeyval");
  147. }
  148. (keys->skeycoms) =
  149. (char **)realloc(keys->skeycoms, ((keys->nskeys) + 1) * sizeof(char *));
  150. if (!(keys->skeycoms)) {
  151. HPIC_ERROR(HPIC_ERR_ALLOC, "cannot realloc skeycoms");
  152. }
  153. (keys->skeycoms[keys->nskeys]) = (char *)calloc(HPIC_STRNL, sizeof(char));
  154. if (!(keys->skeycoms[keys->nskeys])) {
  155. HPIC_ERROR(HPIC_ERR_ALLOC, "cannot allocated appended skeycom");
  156. }
  157. strncpy(keys->skeynames[keys->nskeys], keyname, HPIC_STRNL);
  158. strncpy(keys->skeyvals[keys->nskeys], keyval, HPIC_STRNL);
  159. strncpy(keys->skeycoms[keys->nskeys], keycom, HPIC_STRNL);
  160. (keys->nskeys)++;
  161. return 0;
  162. } else {
  163. HPIC_ERROR(HPIC_ERR_ACCESS, "keys pointer is NULL");
  164. }
  165. }
  166. int hpic_keys_iadd(hpic_keys * keys, char *keyname, int keyval, char *keycom)
  167. {
  168. if (keys) {
  169. (keys->ikeynames) =
  170. (char **)realloc(keys->ikeynames,
  171. ((keys->nikeys) + 1) * sizeof(char *));
  172. if (!(keys->ikeynames)) {
  173. HPIC_ERROR(HPIC_ERR_ALLOC, "cannot realloc ikeynames");
  174. }
  175. (keys->ikeynames[keys->nikeys]) =
  176. (char *)calloc(HPIC_STRNL, sizeof(char));
  177. if (!(keys->ikeynames[keys->nikeys])) {
  178. HPIC_ERROR(HPIC_ERR_ALLOC, "cannot allocated appended ikeyname");
  179. }
  180. (keys->ikeyvals) =
  181. (int *)realloc(keys->ikeyvals, ((keys->nikeys) + 1) * sizeof(int));
  182. if (!(keys->ikeyvals)) {
  183. HPIC_ERROR(HPIC_ERR_ALLOC, "cannot realloc ikeyvals");
  184. }
  185. (keys->ikeycoms) =
  186. (char **)realloc(keys->ikeycoms, ((keys->nikeys) + 1) * sizeof(char *));
  187. if (!(keys->ikeycoms)) {
  188. HPIC_ERROR(HPIC_ERR_ALLOC, "cannot realloc ikeycoms");
  189. }
  190. (keys->ikeycoms[keys->nikeys]) = (char *)calloc(HPIC_STRNL, sizeof(char));
  191. if (!(keys->ikeycoms[keys->nikeys])) {
  192. HPIC_ERROR(HPIC_ERR_ALLOC, "cannot allocated appended ikeycom");
  193. }
  194. strncpy(keys->ikeynames[keys->nikeys], keyname, HPIC_STRNL);
  195. keys->ikeyvals[keys->nikeys] = keyval;
  196. strncpy(keys->ikeycoms[keys->nikeys], keycom, HPIC_STRNL);
  197. (keys->nikeys)++;
  198. return 0;
  199. } else {
  200. HPIC_ERROR(HPIC_ERR_ACCESS, "keys pointer is NULL");
  201. }
  202. }
  203. int hpic_keys_fadd(hpic_keys * keys, char *keyname, float keyval, char *keycom)
  204. {
  205. if (keys) {
  206. (keys->fkeynames) =
  207. (char **)realloc(keys->fkeynames,
  208. ((keys->nfkeys) + 1) * sizeof(char *));
  209. if (!(keys->fkeynames)) {
  210. HPIC_ERROR(HPIC_ERR_ALLOC, "cannot realloc fkeynames");
  211. }
  212. (keys->fkeynames[keys->nfkeys]) =
  213. (char *)calloc(HPIC_STRNL, sizeof(char));
  214. if (!(keys->fkeynames[keys->nfkeys])) {
  215. HPIC_ERROR(HPIC_ERR_ALLOC, "cannot allocated appended fkeyname");
  216. }
  217. (keys->fkeyvals) =
  218. (float *)realloc(keys->fkeyvals, ((keys->nfkeys) + 1) * sizeof(float));
  219. if (!(keys->fkeyvals)) {
  220. HPIC_ERROR(HPIC_ERR_ALLOC, "cannot realloc fkeyvals");
  221. }
  222. (keys->fkeycoms) =
  223. (char **)realloc(keys->fkeycoms, ((keys->nfkeys) + 1) * sizeof(char *));
  224. if (!(keys->fkeycoms)) {
  225. HPIC_ERROR(HPIC_ERR_ALLOC, "cannot realloc fkeycoms");
  226. }
  227. (keys->fkeycoms[keys->nfkeys]) = (char *)calloc(HPIC_STRNL, sizeof(char));
  228. if (!(keys->fkeycoms[keys->nfkeys])) {
  229. HPIC_ERROR(HPIC_ERR_ALLOC, "cannot allocated appended fkeycom");
  230. }
  231. strncpy(keys->fkeynames[keys->nfkeys], keyname, HPIC_STRNL);
  232. keys->fkeyvals[keys->nfkeys] = keyval;
  233. strncpy(keys->fkeycoms[keys->nfkeys], keycom, HPIC_STRNL);
  234. (keys->nfkeys)++;
  235. return 0;
  236. } else {
  237. HPIC_ERROR(HPIC_ERR_ACCESS, "keys pointer is NULL");
  238. }
  239. }
  240. /* delete keys */
  241. int hpic_keys_del(hpic_keys * keys, char *keyname)
  242. {
  243. size_t i, j;
  244. if (keys) {
  245. i = 0;
  246. while (i < (keys->nskeys)) {
  247. if (strncmp(keys->skeynames[i], keyname, HPIC_STRNL) == 0) {
  248. for (j = i; j < (keys->nskeys) - 1; j++) {
  249. strncpy(keys->skeynames[j], keys->skeynames[j + 1], HPIC_STRNL);
  250. strncpy(keys->skeyvals[j], keys->skeyvals[j + 1], HPIC_STRNL);
  251. strncpy(keys->skeycoms[j], keys->skeycoms[j + 1], HPIC_STRNL);
  252. }
  253. free(keys->skeynames[(keys->nskeys) - 1]);
  254. free(keys->skeyvals[(keys->nskeys) - 1]);
  255. free(keys->skeycoms[(keys->nskeys) - 1]);
  256. (keys->nskeys)--;
  257. if (keys->nskeys > 0) {
  258. (keys->skeynames) =
  259. (char **)realloc(keys->skeynames, (keys->nskeys) * sizeof(char *));
  260. if (!(keys->skeynames)) {
  261. HPIC_ERROR(HPIC_ERR_ALLOC, "cannot realloc skeynames");
  262. }
  263. (keys->skeyvals) =
  264. (char **)realloc(keys->skeyvals, (keys->nskeys) * sizeof(char *));
  265. if (!(keys->skeyvals)) {
  266. HPIC_ERROR(HPIC_ERR_ALLOC, "cannot realloc skeyvals");
  267. }
  268. (keys->skeycoms) =
  269. (char **)realloc(keys->skeycoms, (keys->nskeys) * sizeof(char *));
  270. if (!(keys->skeycoms)) {
  271. HPIC_ERROR(HPIC_ERR_ALLOC, "cannot realloc skeycoms");
  272. }
  273. } else {
  274. free(keys->skeynames);
  275. free(keys->skeyvals);
  276. free(keys->skeycoms);
  277. }
  278. } else {
  279. i++;
  280. }
  281. }
  282. i = 0;
  283. while (i < (keys->nikeys)) {
  284. if (strncmp(keys->ikeynames[i], keyname, HPIC_STRNL) == 0) {
  285. for (j = i; j < (keys->nikeys) - 1; j++) {
  286. strncpy(keys->ikeynames[j], keys->ikeynames[j + 1], HPIC_STRNL);
  287. keys->ikeyvals[j] = keys->ikeyvals[j + 1];
  288. strncpy(keys->ikeycoms[j], keys->ikeycoms[j + 1], HPIC_STRNL);
  289. }
  290. free(keys->ikeynames[(keys->nikeys) - 1]);
  291. free(keys->ikeycoms[(keys->nikeys) - 1]);
  292. (keys->nikeys)--;
  293. if (keys->nikeys > 0) {
  294. (keys->ikeynames) =
  295. (char **)realloc(keys->ikeynames, (keys->nikeys) * sizeof(char *));
  296. if (!(keys->ikeynames)) {
  297. HPIC_ERROR(HPIC_ERR_ALLOC, "cannot realloc ikeynames");
  298. }
  299. (keys->ikeyvals) =
  300. (int *)realloc(keys->ikeyvals, (keys->nikeys) * sizeof(int));
  301. if (!(keys->ikeyvals)) {
  302. HPIC_ERROR(HPIC_ERR_ALLOC, "cannot realloc ikeyvals");
  303. }
  304. (keys->ikeycoms) =
  305. (char **)realloc(keys->ikeycoms, (keys->nikeys) * sizeof(char *));
  306. if (!(keys->ikeycoms)) {
  307. HPIC_ERROR(HPIC_ERR_ALLOC, "cannot realloc ikeycoms");
  308. }
  309. } else {
  310. free(keys->ikeynames);
  311. free(keys->ikeyvals);
  312. free(keys->ikeycoms);
  313. }
  314. } else {
  315. i++;
  316. }
  317. }
  318. i = 0;
  319. while (i < (keys->nfkeys)) {
  320. if (strncmp(keys->fkeynames[i], keyname, HPIC_STRNL) == 0) {
  321. for (j = i; j < (keys->nfkeys) - 1; j++) {
  322. strncpy(keys->fkeynames[j], keys->fkeynames[j + 1], HPIC_STRNL);
  323. keys->fkeyvals[j] = keys->fkeyvals[j + 1];
  324. strncpy(keys->fkeycoms[j], keys->fkeycoms[j + 1], HPIC_STRNL);
  325. }
  326. free(keys->fkeynames[(keys->nfkeys) - 1]);
  327. free(keys->fkeycoms[(keys->nfkeys) - 1]);
  328. (keys->nfkeys)--;
  329. if (keys->nfkeys > 0) {
  330. (keys->fkeynames) =
  331. (char **)realloc(keys->fkeynames, (keys->nfkeys) * sizeof(char *));
  332. if (!(keys->fkeynames)) {
  333. HPIC_ERROR(HPIC_ERR_ALLOC, "cannot realloc fkeynames");
  334. }
  335. (keys->fkeyvals) =
  336. (float *)realloc(keys->fkeyvals, (keys->nfkeys) * sizeof(float));
  337. if (!(keys->fkeyvals)) {
  338. HPIC_ERROR(HPIC_ERR_ALLOC, "cannot realloc fkeyvals");
  339. }
  340. (keys->fkeycoms) =
  341. (char **)realloc(keys->fkeycoms, (keys->nfkeys) * sizeof(char *));
  342. if (!(keys->fkeycoms)) {
  343. HPIC_ERROR(HPIC_ERR_ALLOC, "cannot realloc fkeycoms");
  344. }
  345. } else {
  346. free(keys->fkeynames);
  347. free(keys->fkeyvals);
  348. free(keys->fkeycoms);
  349. }
  350. } else {
  351. i++;
  352. }
  353. }
  354. return 0;
  355. } else {
  356. HPIC_ERROR(HPIC_ERR_ACCESS, "keys pointer is NULL");
  357. }
  358. }
  359. /* lookup keys */
  360. int hpic_keys_total(hpic_keys * keys)
  361. {
  362. int total = 0;
  363. if (keys) {
  364. total += (int)(keys->nskeys);
  365. total += (int)(keys->nikeys);
  366. total += (int)(keys->nfkeys);
  367. return total;
  368. } else {
  369. HPIC_ERROR_VAL(HPIC_ERR_ACCESS, "keys pointer is NULL", 0);
  370. }
  371. }
  372. int hpic_keys_sfind(hpic_keys * keys, char *keyname, char *keyval, char *keycom)
  373. {
  374. size_t i, j;
  375. if (keys) {
  376. for (i = 0; i < (keys->nskeys); i++) {
  377. if (strncmp(keys->skeynames[i], keyname, HPIC_STRNL) == 0) {
  378. strncpy(keyval, keys->skeyvals[i], HPIC_STRNL);
  379. strncpy(keycom, keys->skeycoms[i], HPIC_STRNL);
  380. return 0;
  381. }
  382. }
  383. strncpy(keyval, "", HPIC_STRNL);
  384. strncpy(keycom, "", HPIC_STRNL);
  385. return 1;
  386. } else {
  387. HPIC_ERROR(HPIC_ERR_ACCESS, "keys pointer is NULL");
  388. }
  389. }
  390. int hpic_keys_ifind(hpic_keys * keys, char *keyname, int *keyval, char *keycom)
  391. {
  392. size_t i, j;
  393. if (keys) {
  394. for (i = 0; i < (keys->nikeys); i++) {
  395. if (strncmp(keys->ikeynames[i], keyname, HPIC_STRNL) == 0) {
  396. (*keyval) = keys->ikeyvals[i];
  397. strncpy(keycom, keys->ikeycoms[i], HPIC_STRNL);
  398. return 0;
  399. }
  400. }
  401. (*keyval) = 0;
  402. strncpy(keycom, "", HPIC_STRNL);
  403. return 1;
  404. } else {
  405. HPIC_ERROR(HPIC_ERR_ACCESS, "keys pointer is NULL");
  406. }
  407. }
  408. int hpic_keys_ffind(hpic_keys * keys, char *keyname, float *keyval, char *keycom)
  409. {
  410. size_t i, j;
  411. if (keys) {
  412. for (i = 0; i < (keys->nfkeys); i++) {
  413. if (strncmp(keys->fkeynames[i], keyname, HPIC_STRNL) == 0) {
  414. (*keyval) = keys->fkeyvals[i];
  415. strncpy(keycom, keys->fkeycoms[i], HPIC_STRNL);
  416. return 0;
  417. }
  418. }
  419. (*keyval) = 0.0;
  420. strncpy(keycom, "", HPIC_STRNL);
  421. return 1;
  422. } else {
  423. HPIC_ERROR(HPIC_ERR_ACCESS, "keys pointer is NULL");
  424. }
  425. }
  426. /* read keys */
  427. int hpic_keys_read(hpic_keys * keys, fitsfile * fp, int *ret)
  428. {
  429. size_t i, j;
  430. int nread = 0;
  431. int rec = 0;
  432. size_t nexc = 21;
  433. char **exclist;
  434. char **inclist;
  435. char card[HPIC_STRNL];
  436. char keyval[HPIC_STRNL];
  437. char strval[HPIC_STRNL];
  438. char keycom[HPIC_STRNL];
  439. char keytype;
  440. char keyname[HPIC_STRNL];
  441. int keylen;
  442. exclist = hpic_strarr_alloc(nexc);
  443. inclist = hpic_strarr_alloc(1);
  444. /*exclude required keywords */
  445. strcpy(exclist[0], "XTENSION");
  446. strcpy(exclist[1], "BITPIX");
  447. strcpy(exclist[2], "NAXIS*");
  448. strcpy(exclist[3], "PCOUNT");
  449. strcpy(exclist[4], "GCOUNT");
  450. strcpy(exclist[5], "TFIELDS");
  451. strcpy(exclist[6], "TTYPE*");
  452. strcpy(exclist[7], "TFORM*");
  453. strcpy(exclist[8], "TUNIT*");
  454. strcpy(exclist[9], "EXTNAME");
  455. strcpy(exclist[10], "PIXTYPE");
  456. strcpy(exclist[11], "ORDERING");
  457. strcpy(exclist[12], "NSIDE");
  458. strcpy(exclist[13], "COORDSYS");
  459. strcpy(exclist[14], "INDXSCHM");
  460. strcpy(exclist[15], "GRAIN");
  461. strcpy(exclist[16], "COMMENT");
  462. strcpy(exclist[17], "TBCOL*");
  463. strcpy(exclist[18], "SIMPLE");
  464. strcpy(exclist[19], "EXTEND");
  465. strcpy(exclist[19], "CREATOR");
  466. strcpy(inclist[0], "*");
  467. (*ret) = 0;
  468. if (fits_read_record(fp, rec, card, ret)) {
  469. fitserr((*ret), "hpic_keys_read: rewinding key pointer");
  470. }
  471. while (!fits_find_nextkey(fp, inclist, 1, exclist, (int)nexc, card, ret)) {
  472. fits_get_keyname(card, keyname, &keylen, ret);
  473. fits_parse_value(card, keyval, keycom, ret);
  474. fits_get_keytype(keyval, &keytype, ret);
  475. switch (keytype) {
  476. case 'I':
  477. hpic_keys_iadd(keys, keyname, atoi(keyval), keycom);
  478. break;
  479. case 'F':
  480. hpic_keys_fadd(keys, keyname, (float)atof(keyval), keycom);
  481. break;
  482. default:
  483. hpic_keys_sadd(keys, keyname, keyval, keycom);
  484. break;
  485. }
  486. nread++;
  487. }
  488. (*ret = 0);
  489. hpic_strarr_free(exclist, nexc);
  490. hpic_strarr_free(inclist, 1);
  491. return nread;
  492. }
  493. /* write keys */
  494. int hpic_keys_write(hpic_keys * keys, fitsfile * fp, int *ret)
  495. {
  496. size_t i, j;
  497. int nwrit = 0;
  498. for (i = 0; i < (keys->nskeys); i++) {
  499. if (fits_write_key
  500. (fp, TSTRING, keys->skeynames[i], keys->skeyvals[i],
  501. keys->skeycoms[i], ret)) {
  502. fitserr((*ret), "hpic_keys_write: writing string key");
  503. }
  504. nwrit++;
  505. }
  506. for (i = 0; i < (keys->nikeys); i++) {
  507. if (fits_write_key
  508. (fp, TINT, keys->ikeynames[i], &(keys->ikeyvals[i]),
  509. keys->ikeycoms[i], ret)) {
  510. fitserr((*ret), "hpic_keys_write: writing integer key");
  511. }
  512. nwrit++;
  513. }
  514. for (i = 0; i < (keys->nfkeys); i++) {
  515. if (fits_write_key
  516. (fp, TFLOAT, keys->fkeynames[i], &(keys->fkeyvals[i]),
  517. keys->fkeycoms[i], ret)) {
  518. fitserr((*ret), "hpic_keys_write: writing float key");
  519. }
  520. nwrit++;
  521. }
  522. return nwrit;
  523. }
  524. /* info printing */
  525. int hpic_keys_fprintf(FILE * fp, hpic_keys * keys)
  526. {
  527. size_t i;
  528. if (keys) {
  529. fprintf(fp, "# %d Optional Keys\n", hpic_keys_total(keys));
  530. for (i = 0; i < (keys->nskeys); i++) {
  531. fprintf(fp, "# %20s = %20s / %25s\n", keys->skeynames[i],
  532. keys->skeyvals[i], keys->skeycoms[i]);
  533. }
  534. for (i = 0; i < (keys->nikeys); i++) {
  535. fprintf(fp, "# %20s = %20d / %25s\n", keys->ikeynames[i],
  536. keys->ikeyvals[i], keys->ikeycoms[i]);
  537. }
  538. for (i = 0; i < (keys->nfkeys); i++) {
  539. fprintf(fp, "# %20s = %20e / %25s\n", keys->fkeynames[i],
  540. keys->fkeyvals[i], keys->fkeycoms[i]);
  541. }
  542. return 0;
  543. } else {
  544. HPIC_ERROR(HPIC_ERR_ACCESS, "keys pointer is NULL");
  545. }
  546. }
  547. int hpic_keys_printf(hpic_keys * keys)
  548. {
  549. return hpic_keys_fprintf(stdout, keys);
  550. }