123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148 |
- /*
- * This file is part of the zlog Library.
- *
- * Copyright (C) 2011 by Hardy Simpson <HardySimpson1984@gmail.com>
- *
- * Licensed under the LGPL v2.1, see the file COPYING in base directory.
- */
- #include <string.h>
- #include <syslog.h>
- #include <stdlib.h>
- #include <ctype.h>
- #include <stdio.h>
- #include <errno.h>
- #include "zc_defs.h"
- size_t zc_parse_byte_size(char *astring)
- {
- /* Parse size in bytes depending on the suffix. Valid suffixes are KB, MB and GB */
- char *p;
- char *q;
- size_t sz;
- long res;
- int c, m;
- zc_assert(astring, 0);
- /* clear space */
- for (p = q = astring; *p != '\0'; p++) {
- if (isspace(*p)) {
- continue;
- } else {
- *q = *p;
- q++;
- }
- }
- *q = '\0';
- sz = strlen(astring);
- res = strtol(astring, (char **)NULL, 10);
- if (res <= 0)
- return 0;
- if (astring[sz - 1] == 'B' || astring[sz - 1] == 'b') {
- c = astring[sz - 2];
- m = 1024;
- } else {
- c = astring[sz - 1];
- m = 1000;
- }
- switch (c) {
- case 'K':
- case 'k':
- res *= m;
- break;
- case 'M':
- case 'm':
- res *= m * m;
- break;
- case 'G':
- case 'g':
- res *= m * m * m;
- break;
- default:
- if (!isdigit(c)) {
- zc_error("Wrong suffix parsing " "size in bytes for string [%s], ignoring suffix",
- astring);
- }
- break;
- }
- return (res);
- }
- /*******************************************************************************/
- int zc_str_replace_env(char *str, size_t str_size)
- {
- char *p;
- char *q;
- char fmt[MAXLEN_CFG_LINE + 1];
- char env_key[MAXLEN_CFG_LINE + 1];
- char env_value[MAXLEN_CFG_LINE + 1];
- int str_len;
- int env_value_len;
- int nscan;
- int nread;
- str_len = strlen(str);
- q = str;
- do {
- p = strchr(q, '%');
- if (!p) {
- /* can't find more % */
- break;
- }
- memset(fmt, 0x00, sizeof(fmt));
- memset(env_key, 0x00, sizeof(env_key));
- memset(env_value, 0x00, sizeof(env_value));
- nread = 0;
- nscan = sscanf(p + 1, "%[.0-9-]%n", fmt + 1, &nread);
- if (nscan == 1) {
- fmt[0] = '%';
- fmt[nread + 1] = 's';
- } else {
- nread = 0;
- strcpy(fmt, "%s");
- }
- q = p + 1 + nread;
- nscan = sscanf(q, "E(%[^)])%n", env_key, &nread);
- if (nscan == 0) {
- continue;
- }
- q += nread;
- if (*(q - 1) != ')') {
- zc_error("in string[%s] can't find match )", p);
- return -1;
- }
- env_value_len = snprintf(env_value, sizeof(env_value), fmt, getenv(env_key));
- if (env_value_len < 0 || env_value_len >= sizeof(env_value)) {
- zc_error("snprintf fail, errno[%d], evn_value_len[%d]",
- errno, env_value_len);
- return -1;
- }
- str_len = str_len - (q - p) + env_value_len;
- if (str_len > str_size - 1) {
- zc_error("repalce env_value[%s] cause overlap", env_value);
- return -1;
- }
- memmove(p + env_value_len, q, strlen(q) + 1);
- memcpy(p, env_value, env_value_len);
- } while (1);
- return 0;
- }
|