finslib_decode.cpp 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. #include <ctype.h>
  2. #include "fins.h"
  3. /*
  4. * bool XX_finslib_decode_address( const char *str, fins_address_tp *address );
  5. *
  6. * 将一个字符串作为参数并将其解码为一个同名地址对。
  7. * 该功能跳过空格和其他明显的非功能性字符。
  8. * 成功时,返回false值,并在转换出现问题时返回true。
  9. *
  10. * 位引用必须使用DOT符号,例如H82.1来生成正确的地址。
  11. */
  12. bool XX_finslib_decode_address(const char *str, struct fins_address_tp *address) {
  13. size_t num_char;
  14. uint32_t main_address;
  15. uint32_t sub_address;
  16. char name[4];
  17. const char *ptr;
  18. if (str == NULL || address == NULL) return true;
  19. num_char = 0;
  20. ptr = str;
  21. main_address = 0;
  22. sub_address = 0;
  23. while (isspace(*ptr)) ptr++;
  24. while (isalpha(*ptr) && num_char < 3) {
  25. name[num_char] = (char)toupper(*ptr);
  26. num_char++;
  27. ptr++;
  28. }
  29. if (isalpha(*ptr)) return true;
  30. while (num_char < 4) name[num_char++] = 0;
  31. while (isspace(*ptr)) ptr++;
  32. if (!isdigit(*ptr)) return true;
  33. while (isdigit(*ptr)) {
  34. main_address *= 10;
  35. main_address += *ptr - '0';
  36. ptr++;
  37. }
  38. if (*ptr == '.') {
  39. ptr++;
  40. while (isdigit(*ptr)) {
  41. sub_address *= 10;
  42. sub_address += *ptr - '0';
  43. ptr++;
  44. }
  45. if (sub_address > 15) return true;
  46. }
  47. while (isdigit(*ptr)) ptr++;
  48. if (*ptr) return true;
  49. address->name[0] = name[0];
  50. address->name[1] = name[1];
  51. address->name[2] = name[2];
  52. address->name[3] = name[3];
  53. address->main_address = main_address;
  54. address->sub_address = sub_address;
  55. return false;
  56. } /* XX_finslib_decode_address */