int merge_one_string(U_64 *array, int l_array, char *string, struct module *mod, int n_item) { int i, len; U_64 array_2[MAX_COL_NUM] = {0}; struct mod_info *info = mod->info; if (!(len = convert_record_to_array(array_2, l_array, string))) { return 0; } for (i=0; i < len; i++) { switch (info[i].merge_mode) { case MERGE_SUM: array[i] += array_2[i]; break; case MERGE_AVG: array[i] = (array[i] * (n_item - 1) + array_2[i]) / n_item; break; default: ; } } return 1; }
/* * computer mod->st_array and swap cur_info to pre_info * return: 1 -> ok * 0 -> some mod->n_item have modify will reprint header */ int collect_record_stat() { struct module *mod = NULL; U_64 *tmp, array[MAX_COL_NUM] = {0}; int i, n_item, ret, no_p_hdr = 1; for (i = 0; i < statis.total_mod_num; i++) { mod = &mods[i]; if (!mod->enable) continue; memset(array, 0, sizeof(array)); mod->st_flag = 0; ret = 0; if ((n_item = get_strtok_num(mod->record, ITEM_SPLIT))) { /* not merge mode, and last n_item != cur n_item, then reset mod->n_item and set reprint header flag */ if (MERGE_ITEM != conf.print_merge && n_item && n_item != mod->n_item) { no_p_hdr = 0; /* reset struct module fields */ realloc_module_array(mod, n_item); } mod->n_item = n_item; /* multiply item because of have ITEM_SPLIT */ if (strstr(mod->record, ITEM_SPLIT)) { /* merge items */ if (MERGE_ITEM == conf.print_merge) { mod->n_item = 1; ret = merge_mult_item_to_array(mod->cur_array, mod); } else { char item[LEN_128] = {0}; int num = 0; int pos = 0; while (strtok_next_item(item, mod->record, &pos)) { if (!(ret=convert_record_to_array(&mod->cur_array[num * mod->n_col],mod->n_col,item))) break; memset(item, 0, sizeof(item)); num++; } } } else { /* one item */ ret = convert_record_to_array(mod->cur_array, mod->n_col, mod->record); } /* get st record */ if (no_p_hdr && mod->pre_flag && ret) { set_st_record(mod); } if (!ret) mod->pre_flag = 0; else mod->pre_flag = 1; } else mod->pre_flag = 0; /* swap cur_array to pre_array */ tmp = mod->pre_array; mod->pre_array = mod->cur_array; mod->cur_array = tmp; } return no_p_hdr; }