-static void compact_ds_name(char *source, char *dest)
-{
- int keys_num = 0, i;
- char *save_ptr = NULL, *tmp_ptr = source;
- char *keys[16];
- char len_str[3];
- char tmp[DATA_MAX_NAME_LEN];
- size_t key_chars_remaining = (DATA_MAX_NAME_LEN-1);
- int reserved = 0;
- int offset = 0;
- memset(tmp, 0, sizeof(tmp));
- if(source == NULL || dest == NULL || source[0] == '\0' || dest[0] != '\0')
- {
- return;
- }
- size_t src_len = strlen(source);
- snprintf(len_str, sizeof(len_str), "%zu", src_len);
- unsigned char append_status = 0x0;
- append_status |= (source[src_len - 1] == '-') ? 0x1 : 0x0;
- append_status |= (source[src_len - 1] == '+') ? 0x2 : 0x0;
- while ((keys[keys_num] = strtok_r(tmp_ptr, ":_-+", &save_ptr)) != NULL)
- {
- tmp_ptr = NULL;
- /** capitalize 1st char **/
- keys[keys_num][0] = toupper(keys[keys_num][0]);
- keys_num++;
- if(keys_num >= 16)
- {
- break;
- }
- }
- /** concatenate each part of source string **/
- for(i = 0; i < keys_num; i++)
- {
- strncat(tmp, keys[i], key_chars_remaining);
- key_chars_remaining -= strlen(keys[i]);
- }
- /** to coordinate limitation of length of ds name from RRD
- * we will truncate ds_name
- * when the its length is more than
- * MAX_RRD_DS_NAME_LEN
- */
- if(strlen(tmp) > MAX_RRD_DS_NAME_LEN - 1)
- {
- append_status |= 0x4;
- /** we should reserve space for
- * len_str
- */
- reserved += 2;
- }
- if(append_status & 0x1)
- {
- /** we should reserve space for
- * "Minus"
- */
- reserved += 5;
- }
- if(append_status & 0x2)
- {
- /** we should reserve space for
- * "Plus"
- */
- reserved += 4;
- }
- snprintf(dest, MAX_RRD_DS_NAME_LEN - reserved, "%s", tmp);
- offset = strlen(dest);
- switch (append_status)
- {
- case 0x1:
- memcpy(dest + offset, "Minus", 5);
- break;
- case 0x2:
- memcpy(dest + offset, "Plus", 5);
- break;
- case 0x4:
- memcpy(dest + offset, len_str, 2);
- break;
- case 0x5:
- memcpy(dest + offset, "Minus", 5);
- memcpy(dest + offset + 5, len_str, 2);
- break;
- case 0x6:
- memcpy(dest + offset, "Plus", 4);
- memcpy(dest + offset + 4, len_str, 2);
- break;
- default:
- break;
- }
-}
-static int parse_keys(const char *key_str, char *dset_name, char *ds_name)
-{
- char *ptr, *rptr;
- size_t dset_name_len = 0;
- size_t ds_name_len = 0;
- char tmp_ds_name[DATA_MAX_NAME_LEN];
- memset(tmp_ds_name, 0, sizeof(tmp_ds_name));
- if(dset_name == NULL || ds_name == NULL || key_str == NULL ||
- key_str[0] == '\0' || dset_name[0] != '\0' || ds_name[0] != '\0')
- {
- return -1;
- }
- if((ptr = strchr(key_str, '.')) == NULL
- || (rptr = strrchr(key_str, '.')) == NULL)
- {
- strncpy(dset_name, key_str, DATA_MAX_NAME_LEN - 1);
- strncpy(tmp_ds_name, key_str, DATA_MAX_NAME_LEN - 1);
- goto compact;
- }
- dset_name_len =
- (ptr - key_str) > (DATA_MAX_NAME_LEN - 1) ?
- (DATA_MAX_NAME_LEN - 1) : (ptr - key_str);
- memcpy(dset_name, key_str, dset_name_len);
- ds_name_len =
- (rptr - ptr) > DATA_MAX_NAME_LEN ? DATA_MAX_NAME_LEN : (rptr - ptr);
- if(ds_name_len == 0)
- { /** only have two keys **/
- if(!strncmp(rptr + 1, "type", 4))
- {/** if last key is "type",ignore **/
- strncpy(tmp_ds_name, dset_name, DATA_MAX_NAME_LEN - 1);
- }
- else
- {/** if last key isn't "type", copy last key **/
- strncpy(tmp_ds_name, rptr + 1, DATA_MAX_NAME_LEN - 1);
- }
- }
- else if(!strncmp(rptr + 1, "type", 4))
- {/** more than two keys **/
- memcpy(tmp_ds_name, ptr + 1, ds_name_len - 1);
- }
- else
- {/** copy whole keys **/
- strncpy(tmp_ds_name, ptr + 1, DATA_MAX_NAME_LEN - 1);
- }
- compact: compact_ds_name(tmp_ds_name, ds_name);