issn.c
上传用户:blenddy
上传日期:2007-01-07
资源大小:6495k
文件大小:3k
源码类别:

数据库系统

开发平台:

Unix_Linux

  1. /*
  2.  * PostgreSQL type definitions for ISSNs.
  3.  *
  4.  * $Id: issn.c,v 1.2 1999/05/25 16:05:42 momjian Exp $
  5.  */
  6. #include <stdio.h>
  7. #include <postgres.h>
  8. #include <utils/palloc.h>
  9. /*
  10.  * This is the internal storage format for ISSNs.
  11.  * NB: This is an intentional type pun with builtin type `char16'.
  12.  */
  13. typedef struct issn
  14. {
  15. char num[9];
  16. char pad[7];
  17. } issn;
  18. /*
  19.  * Various forward declarations:
  20.  */
  21. issn    *issn_in(char *str);
  22. char    *issn_out(issn * addr);
  23. bool issn_lt(issn * a1, issn * a2);
  24. bool issn_le(issn * a1, issn * a2);
  25. bool issn_eq(issn * a1, issn * a2);
  26. bool issn_ge(issn * a1, issn * a2);
  27. bool issn_gt(issn * a1, issn * a2);
  28. bool issn_ne(issn * a1, issn * a2);
  29. int4 issn_cmp(issn * a1, issn * a2);
  30. int4 issn_sum(char *str);
  31. /*
  32.  * ISSN reader.
  33.  */
  34. issn *
  35. issn_in(char *str)
  36. {
  37. issn    *result;
  38. char    *cp;
  39. int count;
  40. if (strlen(str) != 9)
  41. {
  42. elog(ERROR, "issn_in: invalid ISSN "%s"", str);
  43. return (NULL);
  44. }
  45. if (issn_sum(str) != 0)
  46. {
  47. elog(ERROR, "issn_in: purported ISSN "%s" failed checksum",
  48.  str);
  49. return (NULL);
  50. }
  51. result = (issn *) palloc(sizeof(issn));
  52. strncpy(result->num, str, 9);
  53. memset(result->pad, ' ', 7);
  54. return (result);
  55. }
  56. /*
  57.  * The ISSN checksum works just like the ISBN sum, only different
  58.  * (of course!).
  59.  * Here, the weights start at 8 and decrease.
  60.  */
  61. int4
  62. issn_sum(char *str)
  63. {
  64. int4 sum = 0,
  65. dashes = 0,
  66. val;
  67. int i;
  68. for (i = 0; str[i] && i < 9; i++)
  69. {
  70. switch (str[i])
  71. {
  72. case '-':
  73. if (++dashes > 1)
  74. return 12;
  75. continue;
  76. case '0':
  77. case '1':
  78. case '2':
  79. case '3':
  80. case '4':
  81. case '5':
  82. case '6':
  83. case '7':
  84. case '8':
  85. case '9':
  86. val = str[i] - '0';
  87. break;
  88. case 'X':
  89. case 'x':
  90. val = 10;
  91. break;
  92. default:
  93. return 12;
  94. }
  95. sum += val * (8 - (i - dashes));
  96. }
  97. return (sum % 11);
  98. }
  99. /*
  100.  * ISSN output function.
  101.  */
  102. char *
  103. issn_out(issn * num)
  104. {
  105. char    *result;
  106. if (num == NULL)
  107. return (NULL);
  108. result = (char *) palloc(14);
  109. result[0] = '';
  110. strncat(result, num->num, 9);
  111. return (result);
  112. }
  113. /*
  114.  * Boolean tests for magnitude.
  115.  */
  116. bool
  117. issn_lt(issn * a1, issn * a2)
  118. {
  119. return (strncmp(a1->num, a2->num, 9) < 0);
  120. };
  121. bool
  122. issn_le(issn * a1, issn * a2)
  123. {
  124. return (strncmp(a1->num, a2->num, 9) <= 0);
  125. };
  126. bool
  127. issn_eq(issn * a1, issn * a2)
  128. {
  129. return (strncmp(a1->num, a2->num, 9) == 0);
  130. };
  131. bool
  132. issn_ge(issn * a1, issn * a2)
  133. {
  134. return (strncmp(a1->num, a2->num, 9) >= 0);
  135. };
  136. bool
  137. issn_gt(issn * a1, issn * a2)
  138. {
  139. return (strncmp(a1->num, a2->num, 9) > 0);
  140. };
  141. bool
  142. issn_ne(issn * a1, issn * a2)
  143. {
  144. return (strncmp(a1->num, a2->num, 9) != 0);
  145. };
  146. /*
  147.  * Comparison function for sorting:
  148.  */
  149. int4
  150. issn_cmp(issn * a1, issn * a2)
  151. {
  152. return (strncmp(a1->num, a2->num, 9));
  153. }
  154. /*
  155.  * eof
  156.  */