static int on_config_header_2arg(h2o_configurator_command_t *cmd, h2o_configurator_context_t *ctx, int cmd_id, yoml_t *node) { h2o_iovec_t *name, value; if (extract_name_value(node->data.scalar, &name, &value) != 0) { h2o_configurator_errprintf(cmd, node, "failed to parse the value; should be in form of `name: value`"); return -1; } if (add_cmd(cmd, node, cmd_id, name, value) != 0) return -1; return 0; }
//--------------------------------------------------------------- // START FUNC DECL int f1f2f3f4opf5( char *tbl, char *f1, char *f2, char *f3, char *f4, char *str_op_spec, char *f5 ) // STOP FUNC DECL { int status = 0; char *f1_X = NULL; size_t f1_nX = 0; char *nn_f1_X = NULL; size_t nn_f1_nX = 0; char *f2_X = NULL; size_t f2_nX = 0; char *nn_f2_X = NULL; size_t nn_f2_nX = 0; char *f3_X = NULL; size_t f3_nX = 0; char *nn_f3_X = NULL; size_t nn_f3_nX = 0; char *f4_X = NULL; size_t f4_nX = 0; char *nn_f4_X = NULL; size_t nn_f4_nX = 0; char *out_X = NULL; size_t out_nX = 0; char *nn_out_X = NULL; size_t nn_out_nX = 0; char *opfile = NULL, *nn_opfile = NULL; FILE *ofp = NULL; FLD_TYPE *f1_meta = NULL, *nn_f1_meta = NULL; FLD_TYPE *f2_meta = NULL, *nn_f2_meta = NULL; FLD_TYPE *f3_meta = NULL, *nn_f3_meta = NULL; FLD_TYPE *f4_meta = NULL, *nn_f4_meta = NULL; long long nR; int tbl_id = INT_MIN; int f1_id = INT_MIN, f2_id = INT_MIN, f3_id = INT_MIN, f4_id = INT_MIN, f5_id = INT_MIN; int nn_f1_id = INT_MIN, nn_f2_id = INT_MIN, nn_f3_id = INT_MIN, nn_f4_id = INT_MIN, nn_f5_id = INT_MIN; char str_meta_data[1024]; bool is_any_null = false; float *f1ptr = NULL, *f2ptr = NULL, *f3ptr = NULL, *f4ptr = NULL; float *foutptr = NULL; char *nn_out = NULL; char *op = NULL; //---------------------------------------------------------------- if ( ( tbl == NULL ) || ( *tbl == '\0' ) ) { go_BYE(-1); } if ( ( f1 == NULL ) || ( *f1 == '\0' ) ) { go_BYE(-1); } if ( ( f2 == NULL ) || ( *f2 == '\0' ) ) { go_BYE(-1); } if ( ( f3 == NULL ) || ( *f3 == '\0' ) ) { go_BYE(-1); } if ( ( f4 == NULL ) || ( *f4 == '\0' ) ) { go_BYE(-1); } if ( ( f5 == NULL ) || ( *f5 == '\0' ) ) { go_BYE(-1); } if ( ( str_op_spec == NULL ) || ( *str_op_spec == '\0' ) ) { go_BYE(-1); } zero_string(str_meta_data, 1024); //-------------------------------------------------------- status = extract_name_value(str_op_spec, "op=", ":", &op); cBYE(status); if ( op == NULL ) { go_BYE(-1); } //-------------------------------------------------------- status = is_tbl(tbl, &tbl_id); cBYE(status); chk_range(tbl_id, 0, g_n_tbl); nR = g_tbl[tbl_id].nR; //-------------------------------------------------------- /* Get information for field f1 */ status = is_fld(NULL, tbl_id, f1, &f1_id); f1_meta = &(g_fld[f1_id]); status = rs_mmap(f1_meta->filename, &f1_X, &f1_nX, 0); cBYE(status); nn_f1_id = f1_meta->nn_fld_id; if ( nn_f1_id >= 0 ) { nn_f1_meta = &(g_fld[nn_f1_id]); status = rs_mmap(nn_f1_meta->filename, &nn_f1_X, &nn_f1_nX, 0); cBYE(status); } //-------------------------------------------------------- /* Get information for field f2 */ status = is_fld(NULL, tbl_id, f2, &f2_id); f2_meta = &(g_fld[f2_id]); status = rs_mmap(f2_meta->filename, &f2_X, &f2_nX, 0); cBYE(status); nn_f2_id = f2_meta->nn_fld_id; if ( nn_f2_id >= 0 ) { nn_f2_meta = &(g_fld[nn_f2_id]); status = rs_mmap(nn_f2_meta->filename, &nn_f2_X, &nn_f2_nX, 0); cBYE(status); } //-------------------------------------------------------- /* Get information for field f3 */ status = is_fld(NULL, tbl_id, f3, &f3_id); f3_meta = &(g_fld[f3_id]); status = rs_mmap(f3_meta->filename, &f3_X, &f3_nX, 0); cBYE(status); nn_f3_id = f3_meta->nn_fld_id; if ( nn_f3_id >= 0 ) { nn_f3_meta = &(g_fld[nn_f3_id]); status = rs_mmap(nn_f3_meta->filename, &nn_f3_X, &nn_f3_nX, 0); cBYE(status); } //-------------------------------------------------------- /* Get information for field f4 */ status = is_fld(NULL, tbl_id, f4, &f4_id); f4_meta = &(g_fld[f4_id]); status = rs_mmap(f4_meta->filename, &f4_X, &f4_nX, 0); cBYE(status); nn_f4_id = f4_meta->nn_fld_id; if ( nn_f4_id >= 0 ) { nn_f4_meta = &(g_fld[nn_f4_id]); status = rs_mmap(nn_f4_meta->filename, &nn_f4_X, &nn_f4_nX, 0); cBYE(status); } //-------------------------------------------------------- if ( strcmp(f1_meta->fldtype, "float") != 0 ) { go_BYE(-1); } if ( strcmp(f2_meta->fldtype, "float") != 0 ) { go_BYE(-1); } if ( strcmp(f3_meta->fldtype, "float") != 0 ) { go_BYE(-1); } if ( strcmp(f4_meta->fldtype, "float") != 0 ) { go_BYE(-1); } //-------------------------------------------------------- f1ptr = (float *)f1_X; f2ptr = (float *)f2_X; f3ptr = (float *)f3_X; f4ptr = (float *)f4_X; //-------------------------------------------------------- // Create output file long long filesz = sizeof(float) * nR; status = open_temp_file(&ofp, &opfile, filesz); cBYE(status); fclose_if_non_null(ofp); status = mk_file(opfile, filesz); cBYE(status); status = rs_mmap(opfile, &out_X, &out_nX, 1); cBYE(status); foutptr = (float*)out_X; //-------------------------------------------------------- // Create nn field for output file long long nnfilesz = sizeof(char) * nR; status = open_temp_file(&ofp, &nn_opfile, nnfilesz); cBYE(status); fclose_if_non_null(ofp); status = mk_file(nn_opfile, filesz); cBYE(status); status = rs_mmap(nn_opfile, &nn_out_X, &nn_out_nX, 1); cBYE(status); nn_out = (char*)nn_out_X; //-------------------------------------------------------- if ( strcmp(op, "lat_long_dist") == 0 ) { for ( long long i = 0; i < nR; i++ ) { if ( ( nn_f1_X != NULL ) && ( nn_f1_X[i] == 0 ) ) { is_any_null = true; foutptr[i] = 0; nn_out[i] = 0; continue; } if ( ( nn_f2_X != NULL ) && ( nn_f2_X[i] == 0 ) ) { is_any_null = true; foutptr[i] = 0; nn_out[i] = 0; continue; } if ( ( nn_f3_X != NULL ) && ( nn_f3_X[i] == 0 ) ) { is_any_null = true; foutptr[i] = 0; nn_out[i] = 0; continue; } if ( ( nn_f4_X != NULL ) && ( nn_f4_X[i] == 0 ) ) { is_any_null = true; foutptr[i] = 0; nn_out[i] = 0; continue; } if ( ( f1ptr[i] < -90 ) || ( f1ptr[i] > 90 ) ) { go_BYE(-1); } if ( ( f2ptr[i] < -180 ) || ( f2ptr[i] > 180 ) ) { go_BYE(-1); } if ( ( f3ptr[i] < -90 ) || ( f3ptr[i] > 90 ) ) { go_BYE(-1); } if ( ( f4ptr[i] < -180 ) || ( f4ptr[i] > 180 ) ) { go_BYE(-1); } status = latlong_distance(f1ptr[i], f2ptr[i], f3ptr[i], f4ptr[i], &(foutptr[i])); cBYE(status); nn_out[i] = TRUE; } } sprintf(str_meta_data, "filename=%s:fldtype=float:n_sizeof=4", opfile); status = add_fld(tbl, f5, str_meta_data, &f5_id); cBYE(status); if ( is_any_null ) { status = add_aux_fld(tbl, f5, nn_opfile, "nn", &nn_f5_id); cBYE(status); } else { unlink(nn_opfile); free_if_non_null(nn_opfile); } BYE: rs_munmap(f1_X, f1_nX); rs_munmap(nn_f1_X, nn_f1_nX); rs_munmap(f2_X, f2_nX); rs_munmap(nn_f2_X, nn_f2_nX); rs_munmap(f3_X, f3_nX); rs_munmap(nn_f3_X, nn_f3_nX); rs_munmap(f4_X, f4_nX); rs_munmap(nn_f4_X, nn_f4_nX); rs_munmap(out_X, out_nX); rs_munmap(nn_out_X, nn_out_nX); free_if_non_null(opfile); free_if_non_null(nn_opfile); free_if_non_null(op); return(status); }
//--------------------------------------------------------------- // START FUNC DECL int f1opf2( char *tbl, char *f1, char *str_op_spec, char *f2 ) // STOP FUNC DECL { int status = 0; char *f1_X = NULL; size_t f1_nX = 0; char *nn_f1_X = NULL; size_t nn_f1_nX = 0; char *sz_f1_X = NULL; size_t sz_f1_nX = 0; FLD_TYPE *f1_meta = NULL, *nn_f1_meta = NULL, *sz_f1_meta = NULL; long long nR; int tbl_id = INT_MIN, f1_id = INT_MIN, nn_f1_id = INT_MIN, sz_f1_id = INT_MIN; int f2_id = INT_MIN, nn_f2_id = INT_MIN, sz_f2_id = INT_MIN; char str_meta_data[1024]; int f1type; char *op = NULL, *str_val = NULL; FILE *ofp = NULL; char *opfile = NULL; FILE *nn_ofp = NULL; char *nn_opfile = NULL; FILE *sz_ofp = NULL; char *sz_opfile = NULL; char *xform_enum = NULL, *hash_algo = NULL; //---------------------------------------------------------------- if ( ( tbl == NULL ) || ( *tbl == '\0' ) ) { go_BYE(-1); } if ( ( f1 == NULL ) || ( *f1 == '\0' ) ) { go_BYE(-1); } if ( ( f2 == NULL ) || ( *f2 == '\0' ) ) { go_BYE(-1); } if ( ( str_op_spec == NULL ) || ( *str_op_spec == '\0' ) ) { go_BYE(-1); } zero_string(str_meta_data, 1024); //-------------------------------------------------------- status = extract_name_value(str_op_spec, "op=", ":", &op); cBYE(status); if ( op == NULL ) { go_BYE(-1); } //-------------------------------------------------------- status = chk_if_ephemeral(&f2); cBYE(status); status = is_tbl(tbl, &tbl_id); cBYE(status); chk_range(tbl_id, 0, g_n_tbl); nR = g_tbl[tbl_id].nR; status = is_fld(NULL, tbl_id, f1, &f1_id); cBYE(status); chk_range(f1_id, 0, g_n_fld); f1_meta = &(g_fld[f1_id]); status = rs_mmap(f1_meta->filename, &f1_X, &f1_nX, 0); cBYE(status); // Get nn field for f1 if if it exists nn_f1_id = g_fld[f1_id].nn_fld_id; if ( nn_f1_id >= 0 ) { nn_f1_meta = &(g_fld[nn_f1_id]); status = rs_mmap(nn_f1_meta->filename, &nn_f1_X, &nn_f1_nX, 0); cBYE(status); } //--------------------------------------------- status = mk_ifldtype(f1_meta->fldtype, &f1type); /* TODO: Why do we get an error for 'char string' ? */ // If f1 type is 'char string', then get sz field if ( strcmp(f1_meta->fldtype, "char string") == 0 ) { sz_f1_id = g_fld[f1_id].sz_fld_id; chk_range(sz_f1_id, 0, g_n_fld); sz_f1_meta = &(g_fld[sz_f1_id]); status = rs_mmap(sz_f1_meta->filename, &sz_f1_X, &sz_f1_nX, 0); cBYE(status); } //-------------------------------------------------------- if ( strcmp(op, "xform") == 0 ) { bool is_some_null; status = open_temp_file(&ofp, &opfile, 0); cBYE(status); status = open_temp_file(&nn_ofp, &nn_opfile, 0); cBYE(status); status = open_temp_file(&sz_ofp, &sz_opfile, 0); cBYE(status); status = str_xform(nR, f1_X, (int *)sz_f1_X, nn_f1_X, str_op_spec, ofp, nn_ofp, sz_ofp, &is_some_null); cBYE(status); fclose_if_non_null(ofp); fclose_if_non_null(nn_ofp); fclose_if_non_null(sz_ofp); sprintf(str_meta_data, "filename=%s:fldtype=char string:n_sizeof=0", opfile); status = add_fld(tbl, f2, str_meta_data, &f2_id); cBYE(status); status = add_aux_fld(tbl, f2, sz_opfile, "sz", &sz_f2_id); cBYE(status); if ( is_some_null ) { status = add_aux_fld(tbl, f2, nn_opfile, "nn", &nn_f2_id); cBYE(status); } else { unlink(nn_opfile); } } else if ( strcmp(op, "hash") == 0 ) { int hash_len; char *endptr = NULL; status = extract_name_value(str_op_spec, "len=", ":", &str_val); cBYE(status); if ( str_val == NULL ) { go_BYE(-1); } hash_len = strtol(str_val, &endptr, 10); if ( *endptr != '\0' ) { go_BYE(-1); } status = extract_name_value(str_op_spec, "hash_algo=", ":", &hash_algo); cBYE(status); status = open_temp_file(&ofp, &opfile, 0); cBYE(status); status = f1opf2_hash(hash_algo, nR, f1_X, f1_nX, (int *)sz_f1_X, f1_meta->n_sizeof, nn_f1_X, hash_len, ofp); cBYE(status); fclose_if_non_null(ofp); sprintf(str_meta_data, "filename=%s", opfile); switch ( hash_len ) { case 4 : strcat(str_meta_data, ":fldtype=int:n_sizeof=4"); break; case 8 : strcat(str_meta_data, ":fldtype=long long:n_sizeof=8"); break; default : go_BYE(-1); break; } fclose_if_non_null(ofp); status = add_fld(tbl, f2, str_meta_data, &f2_id); cBYE(status); } else if ( ( strcmp(op, "conv") == 0 ) || ( strcmp(op, "dateconv" ) == 0 ) || ( strcmp(op, "bitcount" ) == 0 ) || ( strcmp(op, "sqrt" ) == 0 ) || ( strcmp(op, "!" ) == 0 ) || ( strcmp(op, "++" ) == 0 ) || ( strcmp(op, "--" ) == 0 ) || ( strcmp(op, "~" ) == 0 ) ) { status = vec_f1opf2(nR, f1type, str_meta_data, f1_X, nn_f1_X, sz_f1_X, op, str_op_spec, &opfile, &nn_opfile); cBYE(status); status = add_fld(tbl, f2, str_meta_data, &f2_id); cBYE(status); if ( nn_opfile != NULL ) { status = add_aux_fld(tbl, f2, nn_opfile, "nn", &nn_f2_id); cBYE(status); } } else if ( strcmp(op, "shift") == 0 ) { int ival; char *endptr = NULL; status = extract_name_value(str_op_spec, "val=", ":", &str_val); cBYE(status); ival = strtol(str_val, &endptr, 10); if ( *endptr != '\0' ) { fprintf(stderr, "invalid shift specifier = [%s] \n", str_val); go_BYE(-1); } if ( ( ival == 0 ) || ( ival > MAX_SHIFT ) || ( ival < -MAX_SHIFT ) || (ival >= nR )) { fprintf(stderr, "shift = [%d] is out of bounds \n", ival); go_BYE(-1); } status = open_temp_file(&ofp, &opfile, 0); cBYE(status); status = open_temp_file(&nn_ofp, &nn_opfile, 0); cBYE(status); status = f1opf2_shift(f1_X, nn_f1_X, nR, f1_meta->fldtype, ival, ofp, nn_ofp); cBYE(status); fclose_if_non_null(ofp); fclose_if_non_null(nn_ofp); sprintf(str_meta_data, "filename=%s:fldtype=%s:n_sizeof=%d",opfile, f1_meta->fldtype, f1_meta->n_sizeof); status = add_fld(tbl, f2, str_meta_data, &f2_id); cBYE(status); status = add_aux_fld(tbl, f2, nn_opfile, "nn", &nn_f2_id); cBYE(status); } else if ( strcmp(op, "cum") == 0 ) { /* TODO: Document. If you do a cum, resultant field is all def */ char *new_fld_type = NULL; int optype, n_sizeof; char *str_reset_on = NULL, *str_reset_to = NULL, *endptr = NULL; long long reset_on = 0, reset_to = 0; bool is_reset = false; status = extract_name_value(str_op_spec, "newtype=", ":", &new_fld_type); cBYE(status); status = extract_name_value(str_op_spec, "reset_on=", ":", &str_reset_on); cBYE(status); if ( str_reset_on != NULL ) { reset_on = strtoll(str_reset_on, &endptr, 10); if ( *endptr != '\0' ) { go_BYE(-1); } is_reset = true; status = extract_name_value(str_op_spec, "reset_to=", ":", &str_reset_to); cBYE(status); if ( str_reset_to == NULL ) { go_BYE(-1); } reset_to = strtoll(str_reset_to, &endptr, 10); if ( *endptr != '\0' ) { go_BYE(-1); } } if ( new_fld_type == NULL ) { optype = f1type; new_fld_type = strdup(f1_meta->fldtype); n_sizeof = f1_meta->n_sizeof; } else { if ( strcmp(new_fld_type, "int") == 0 ) { optype = FLDTYPE_INT; n_sizeof = sizeof(int); } else if ( strcmp(new_fld_type, "long long") == 0 ) { optype = FLDTYPE_LONGLONG; n_sizeof = sizeof(long long); } else { go_BYE(-1); } } status = f1opf2_cum(f1_X, nR, f1type, optype, is_reset, reset_on, reset_to, &opfile); cBYE(status); sprintf(str_meta_data, "filename=%s:fldtype=%s:n_sizeof=%d",opfile, new_fld_type, n_sizeof); status = add_fld(tbl, f2, str_meta_data, &f2_id); cBYE(status); free_if_non_null(new_fld_type); free_if_non_null(str_reset_on); free_if_non_null(str_reset_to); } else { fprintf(stderr, "Invalid op = [%s] \n", op); go_BYE(-1); } BYE: fclose_if_non_null(ofp); fclose_if_non_null(nn_ofp); g_write_to_temp_dir = false; rs_munmap(f1_X, f1_nX); rs_munmap(nn_f1_X, nn_f1_nX); rs_munmap(sz_f1_X, sz_f1_nX); free_if_non_null(op); free_if_non_null(xform_enum); free_if_non_null(hash_algo); free_if_non_null(str_val); free_if_non_null(opfile); free_if_non_null(nn_opfile); free_if_non_null(sz_opfile); return(status); }