- 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);