zc_util.c 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. /*
  2. * This file is part of the zlog Library.
  3. *
  4. * Copyright (C) 2011 by Hardy Simpson <HardySimpson1984@gmail.com>
  5. *
  6. * Licensed under the LGPL v2.1, see the file COPYING in base directory.
  7. */
  8. #include <string.h>
  9. #include <syslog.h>
  10. #include <stdlib.h>
  11. #include <ctype.h>
  12. #include <stdio.h>
  13. #include <errno.h>
  14. #include "zc_defs.h"
  15. size_t zc_parse_byte_size(char *astring)
  16. {
  17. /* Parse size in bytes depending on the suffix. Valid suffixes are KB, MB and GB */
  18. char *p;
  19. char *q;
  20. size_t sz;
  21. long res;
  22. int c, m;
  23. zc_assert(astring, 0);
  24. /* clear space */
  25. for (p = q = astring; *p != '\0'; p++) {
  26. if (isspace(*p)) {
  27. continue;
  28. } else {
  29. *q = *p;
  30. q++;
  31. }
  32. }
  33. *q = '\0';
  34. sz = strlen(astring);
  35. res = strtol(astring, (char **)NULL, 10);
  36. if (res <= 0)
  37. return 0;
  38. if (astring[sz - 1] == 'B' || astring[sz - 1] == 'b') {
  39. c = astring[sz - 2];
  40. m = 1024;
  41. } else {
  42. c = astring[sz - 1];
  43. m = 1000;
  44. }
  45. switch (c) {
  46. case 'K':
  47. case 'k':
  48. res *= m;
  49. break;
  50. case 'M':
  51. case 'm':
  52. res *= m * m;
  53. break;
  54. case 'G':
  55. case 'g':
  56. res *= m * m * m;
  57. break;
  58. default:
  59. if (!isdigit(c)) {
  60. zc_error("Wrong suffix parsing " "size in bytes for string [%s], ignoring suffix",
  61. astring);
  62. }
  63. break;
  64. }
  65. return (res);
  66. }
  67. /*******************************************************************************/
  68. int zc_str_replace_env(char *str, size_t str_size)
  69. {
  70. char *p;
  71. char *q;
  72. char fmt[MAXLEN_CFG_LINE + 1];
  73. char env_key[MAXLEN_CFG_LINE + 1];
  74. char env_value[MAXLEN_CFG_LINE + 1];
  75. int str_len;
  76. int env_value_len;
  77. int nscan;
  78. int nread;
  79. str_len = strlen(str);
  80. q = str;
  81. do {
  82. p = strchr(q, '%');
  83. if (!p) {
  84. /* can't find more % */
  85. break;
  86. }
  87. memset(fmt, 0x00, sizeof(fmt));
  88. memset(env_key, 0x00, sizeof(env_key));
  89. memset(env_value, 0x00, sizeof(env_value));
  90. nread = 0;
  91. nscan = sscanf(p + 1, "%[.0-9-]%n", fmt + 1, &nread);
  92. if (nscan == 1) {
  93. fmt[0] = '%';
  94. fmt[nread + 1] = 's';
  95. } else {
  96. nread = 0;
  97. strcpy(fmt, "%s");
  98. }
  99. q = p + 1 + nread;
  100. nscan = sscanf(q, "E(%[^)])%n", env_key, &nread);
  101. if (nscan == 0) {
  102. continue;
  103. }
  104. q += nread;
  105. if (*(q - 1) != ')') {
  106. zc_error("in string[%s] can't find match )", p);
  107. return -1;
  108. }
  109. env_value_len = snprintf(env_value, sizeof(env_value), fmt, getenv(env_key));
  110. if (env_value_len < 0 || env_value_len >= sizeof(env_value)) {
  111. zc_error("snprintf fail, errno[%d], evn_value_len[%d]",
  112. errno, env_value_len);
  113. return -1;
  114. }
  115. str_len = str_len - (q - p) + env_value_len;
  116. if (str_len > str_size - 1) {
  117. zc_error("repalce env_value[%s] cause overlap", env_value);
  118. return -1;
  119. }
  120. memmove(p + env_value_len, q, strlen(q) + 1);
  121. memcpy(p, env_value, env_value_len);
  122. } while (1);
  123. return 0;
  124. }