ASN.xs
上传用户:wxp200602
上传日期:2007-10-30
资源大小:4028k
文件大小:6k
源码类别:

SNMP编程

开发平台:

Unix_Linux

  1. /* -*- C -*- */
  2. #include "EXTERN.h"
  3. #include "perl.h"
  4. #include "XSUB.h"
  5. #include <net-snmp/net-snmp-config.h>
  6. #include <net-snmp/library/asn1.h>
  7. #include <net-snmp/library/snmp_impl.h>
  8. static int
  9. not_here(char *s)
  10. {
  11.     croak("%s not implemented on this architecture", s);
  12.     return -1;
  13. }
  14. static double
  15. constant_ASN_O(char *name, int len, int arg)
  16. {
  17.     switch (name[5 + 0]) {
  18.     case 'B':
  19. if (strEQ(name + 5, "BJECT_ID")) { /* ASN_O removed */
  20. #ifdef ASN_OBJECT_ID
  21.     return ASN_OBJECT_ID;
  22. #else
  23.     goto not_there;
  24. #endif
  25. }
  26.     case 'C':
  27. if (strEQ(name + 5, "CTET_STR")) { /* ASN_O removed */
  28. #ifdef ASN_OCTET_STR
  29.     return ASN_OCTET_STR;
  30. #else
  31.     goto not_there;
  32. #endif
  33. }
  34.     case 'P':
  35. if (strEQ(name + 5, "PAQUE")) { /* ASN_O removed */
  36. #ifdef ASN_OPAQUE
  37.     return ASN_OPAQUE;
  38. #else
  39.     goto not_there;
  40. #endif
  41. }
  42.     }
  43.     errno = EINVAL;
  44.     return 0;
  45. not_there:
  46.     errno = ENOENT;
  47.     return 0;
  48. }
  49. static double
  50. constant_ASN_B(char *name, int len, int arg)
  51. {
  52.     switch (name[5 + 0]) {
  53.     case 'I':
  54. if (strEQ(name + 5, "IT_STR")) { /* ASN_B removed */
  55. #ifdef ASN_BIT_STR
  56.     return ASN_BIT_STR;
  57. #else
  58.     goto not_there;
  59. #endif
  60. }
  61.     case 'O':
  62. if (strEQ(name + 5, "OOLEAN")) { /* ASN_B removed */
  63. #ifdef ASN_BOOLEAN
  64.     return ASN_BOOLEAN;
  65. #else
  66.     goto not_there;
  67. #endif
  68. }
  69.     }
  70.     errno = EINVAL;
  71.     return 0;
  72. not_there:
  73.     errno = ENOENT;
  74.     return 0;
  75. }
  76. static double
  77. constant_ASN_S(char *name, int len, int arg)
  78. {
  79.     if (5 + 1 >= len ) {
  80. errno = EINVAL;
  81. return 0;
  82.     }
  83.     switch (name[5 + 1]) {
  84.     case 'Q':
  85. if (strEQ(name + 5, "EQUENCE")) { /* ASN_S removed */
  86. #ifdef ASN_SEQUENCE
  87.     return ASN_SEQUENCE;
  88. #else
  89.     goto not_there;
  90. #endif
  91. }
  92.     case 'T':
  93. if (strEQ(name + 5, "ET")) { /* ASN_S removed */
  94. #ifdef ASN_SET
  95.     return ASN_SET;
  96. #else
  97.     goto not_there;
  98. #endif
  99. }
  100.     }
  101.     errno = EINVAL;
  102.     return 0;
  103. not_there:
  104.     errno = ENOENT;
  105.     return 0;
  106. }
  107. static double
  108. constant_ASN_C(char *name, int len, int arg)
  109. {
  110.     if (5 + 6 > len ) {
  111. errno = EINVAL;
  112. return 0;
  113.     }
  114.     switch (name[5 + 6]) {
  115.     case '':
  116. if (strEQ(name + 5, "OUNTER")) { /* ASN_C removed */
  117. #ifdef ASN_COUNTER
  118.     return ASN_COUNTER;
  119. #else
  120.     goto not_there;
  121. #endif
  122. }
  123.     case '6':
  124. if (strEQ(name + 5, "OUNTER64")) { /* ASN_C removed */
  125. #ifdef ASN_COUNTER64
  126.     return ASN_COUNTER64;
  127. #else
  128.     goto not_there;
  129. #endif
  130. }
  131.     }
  132.     errno = EINVAL;
  133.     return 0;
  134. not_there:
  135.     errno = ENOENT;
  136.     return 0;
  137. }
  138. static double
  139. constant_ASN_U(char *name, int len, int arg)
  140. {
  141.     if (5 + 7 > len ) {
  142. errno = EINVAL;
  143. return 0;
  144.     }
  145.     switch (name[5 + 7]) {
  146.     case '':
  147. if (strEQ(name + 5, "NSIGNED")) { /* ASN_U removed */
  148. #ifdef ASN_UNSIGNED
  149.     return ASN_UNSIGNED;
  150. #else
  151.     goto not_there;
  152. #endif
  153. }
  154.     case '6':
  155. if (strEQ(name + 5, "NSIGNED64")) { /* ASN_U removed */
  156. #ifdef ASN_UNSIGNED64
  157.     return ASN_UNSIGNED64;
  158. #else
  159.     goto not_there;
  160. #endif
  161. }
  162.     }
  163.     errno = EINVAL;
  164.     return 0;
  165. not_there:
  166.     errno = ENOENT;
  167.     return 0;
  168. }
  169. static double
  170. constant_ASN_IN(char *name, int len, int arg)
  171. {
  172.     if (6 + 5 > len ) {
  173. errno = EINVAL;
  174. return 0;
  175.     }
  176.     switch (name[6 + 5]) {
  177.     case '':
  178. if (strEQ(name + 6, "TEGER")) { /* ASN_IN removed */
  179. #ifdef ASN_INTEGER
  180.     return ASN_INTEGER;
  181. #else
  182.     goto not_there;
  183. #endif
  184. }
  185.     case '6':
  186. if (strEQ(name + 6, "TEGER64")) { /* ASN_IN removed */
  187. #ifdef ASN_INTEGER64
  188.     return ASN_INTEGER64;
  189. #else
  190.     goto not_there;
  191. #endif
  192. }
  193.     }
  194.     errno = EINVAL;
  195.     return 0;
  196. not_there:
  197.     errno = ENOENT;
  198.     return 0;
  199. }
  200. static double
  201. constant_ASN_I(char *name, int len, int arg)
  202. {
  203.     switch (name[5 + 0]) {
  204.     case 'N':
  205. return constant_ASN_IN(name, len, arg);
  206.     case 'P':
  207. if (strEQ(name + 5, "PADDRESS")) { /* ASN_I removed */
  208. #ifdef ASN_IPADDRESS
  209.     return ASN_IPADDRESS;
  210. #else
  211.     goto not_there;
  212. #endif
  213. }
  214.     }
  215.     errno = EINVAL;
  216.     return 0;
  217. not_there:
  218.     errno = ENOENT;
  219.     return 0;
  220. }
  221. static double
  222. constant(char *name, int len, int arg)
  223. {
  224.     errno = 0;
  225.     if (0 + 4 >= len ) {
  226. errno = EINVAL;
  227. return 0;
  228.     }
  229.     switch (name[0 + 4]) {
  230.     case 'A':
  231. if (strEQ(name + 0, "ASN_APPLICATION")) { /*  removed */
  232. #ifdef ASN_APPLICATION
  233.     return ASN_APPLICATION;
  234. #else
  235.     goto not_there;
  236. #endif
  237. }
  238.     case 'B':
  239. if (!strnEQ(name + 0,"ASN_", 4))
  240.     break;
  241. return constant_ASN_B(name, len, arg);
  242.     case 'C':
  243. if (!strnEQ(name + 0,"ASN_", 4))
  244.     break;
  245. return constant_ASN_C(name, len, arg);
  246.     case 'D':
  247. if (strEQ(name + 0, "ASN_DOUBLE")) { /*  removed */
  248. #ifdef ASN_DOUBLE
  249.     return ASN_DOUBLE;
  250. #else
  251.     goto not_there;
  252. #endif
  253. }
  254.     case 'F':
  255. if (strEQ(name + 0, "ASN_FLOAT")) { /*  removed */
  256. #ifdef ASN_FLOAT
  257.     return ASN_FLOAT;
  258. #else
  259.     goto not_there;
  260. #endif
  261. }
  262.     case 'G':
  263. if (strEQ(name + 0, "ASN_GAUGE")) { /*  removed */
  264. #ifdef ASN_GAUGE
  265.     return ASN_GAUGE;
  266. #else
  267.     goto not_there;
  268. #endif
  269. }
  270.     case 'I':
  271. if (!strnEQ(name + 0,"ASN_", 4))
  272.     break;
  273. return constant_ASN_I(name, len, arg);
  274.     case 'N':
  275. if (strEQ(name + 0, "ASN_NULL")) { /*  removed */
  276. #ifdef ASN_NULL
  277.     return ASN_NULL;
  278. #else
  279.     goto not_there;
  280. #endif
  281. }
  282.     case 'O':
  283. if (!strnEQ(name + 0,"ASN_", 4))
  284.     break;
  285. return constant_ASN_O(name, len, arg);
  286.     case 'S':
  287. if (!strnEQ(name + 0,"ASN_", 4))
  288.     break;
  289. return constant_ASN_S(name, len, arg);
  290.     case 'T':
  291. if (strEQ(name + 0, "ASN_TIMETICKS")) { /*  removed */
  292. #ifdef ASN_TIMETICKS
  293.     return ASN_TIMETICKS;
  294. #else
  295.     goto not_there;
  296. #endif
  297. }
  298.     case 'U':
  299. if (!strnEQ(name + 0,"ASN_", 4))
  300.     break;
  301. return constant_ASN_U(name, len, arg);
  302.     }
  303.     errno = EINVAL;
  304.     return 0;
  305. not_there:
  306.     errno = ENOENT;
  307.     return 0;
  308. }
  309. MODULE = NetSNMP::ASN PACKAGE = NetSNMP::ASN
  310. double
  311. constant(sv,arg)
  312.     PREINIT:
  313. STRLEN len;
  314.     INPUT:
  315. SV * sv
  316. char * s = SvPV(sv, len);
  317. int arg
  318.     CODE:
  319. RETVAL = constant(s,len,arg);
  320.     OUTPUT:
  321. RETVAL