static BOOLEAN get_format_type_and_name ( char *sect_start, FF_TYPES_t *fmt_type, char **fmt_name ) { char *token = NULL; char save_char = STR_END; /* See if a format type string is at start of line */ /* Parse candidate format type string into a NULL-terminated string for ff_lookup_number */ token = sect_start; token = get_token(token, &save_char); *fmt_type = ff_lookup_number(format_types, token); token = get_token(token, &save_char); *fmt_name = token; RESTORE_CHAR(token, save_char); return((BOOLEAN)(*fmt_type != FF_VAR_TYPE_FLAG)); }
static char *get_token ( char *text_line, char *save_char ) { char *token_start = NULL; char *token_end = NULL; assert(text_line); if (*save_char) { token_start = text_line + strlen(text_line); RESTORE_CHAR(text_line, *save_char); } else token_start = text_line; while (*token_start && strspn(token_start, LINESPACE)) /* skip non-EOL whitespace */ ++token_start; token_end = NULL; if (*token_start == '"') { token_end = strchr(token_start + 1, '"'); if (token_end) ++token_end; } if (!token_end) { token_end = token_start; while (*token_end && strcspn(token_end, WHITESPACE)) /* scan until any whitespace */ ++token_end; } *save_char = *token_end; *token_end = STR_END; return token_start; }
AB_IMEXPORTER_ACCOUNTINFO* AB_ImExporterAccountInfo_fromDb(GWEN_DB_NODE *db){ AB_IMEXPORTER_ACCOUNTINFO *iea; const char *s; GWEN_DB_NODE *dbT; iea=AB_ImExporterAccountInfo_new(); #define RESTORE_CHAR(NAME) \ s=GWEN_DB_GetCharValue(db, __STRING(NAME), 0, 0);\ if (s)\ iea->NAME=strdup(s); #define RESTORE_INT(NAME, DEFAULT) \ iea->NAME=GWEN_DB_GetIntValue(db, __STRING(NAME), 0, DEFAULT); RESTORE_CHAR(bankCode); RESTORE_CHAR(bankName); RESTORE_CHAR(accountNumber); RESTORE_CHAR(iban); RESTORE_CHAR(bic); RESTORE_CHAR(owner); RESTORE_CHAR(currency); RESTORE_CHAR(description); RESTORE_INT(accountType, AB_AccountType_Bank); RESTORE_INT(accountId, 0); #undef RESTORE_CHAR #undef RESTORE_INT dbT=GWEN_DB_GetGroup(db, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "statusList"); if (dbT) { dbT=GWEN_DB_FindFirstGroup(dbT, "status"); while(dbT) { AB_ACCOUNT_STATUS *ast; ast=AB_AccountStatus_fromDb(dbT); assert(ast); AB_AccountStatus_List_Add(ast, iea->accStatusList); dbT=GWEN_DB_FindNextGroup(dbT, "status"); } } dbT=GWEN_DB_GetGroup(db, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "transactionList"); if (dbT) { dbT=GWEN_DB_FindFirstGroup(dbT, "transaction"); while(dbT) { AB_TRANSACTION *t; t=AB_Transaction_fromDb(dbT); assert(t); AB_Transaction_List_Add(t, iea->transactions); dbT=GWEN_DB_FindNextGroup(dbT, "transaction"); } } dbT=GWEN_DB_GetGroup(db, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "standingOrderList"); if (dbT) { dbT=GWEN_DB_FindFirstGroup(dbT, "standingOrder"); while(dbT) { AB_TRANSACTION *t; t=AB_Transaction_fromDb(dbT); assert(t); AB_Transaction_List_Add(t, iea->standingOrders); dbT=GWEN_DB_FindNextGroup(dbT, "standingOrder"); } } dbT=GWEN_DB_GetGroup(db, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "transferList"); if (dbT) { dbT=GWEN_DB_FindFirstGroup(dbT, "transfer"); while(dbT) { AB_TRANSACTION *t; t=AB_Transaction_fromDb(dbT); assert(t); AB_Transaction_List_Add(t, iea->transfers); dbT=GWEN_DB_FindNextGroup(dbT, "transfer"); } } dbT=GWEN_DB_GetGroup(db, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "datedTransferList"); if (dbT) { dbT=GWEN_DB_FindFirstGroup(dbT, "datedTransfer"); while(dbT) { AB_TRANSACTION *t; t=AB_Transaction_fromDb(dbT); assert(t); AB_Transaction_List_Add(t, iea->datedTransfers); dbT=GWEN_DB_FindNextGroup(dbT, "datedTransfer"); } } dbT=GWEN_DB_GetGroup(db, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "notedTransactionList"); if (dbT) { dbT=GWEN_DB_FindFirstGroup(dbT, "notedTransaction"); while(dbT) { AB_TRANSACTION *t; t=AB_Transaction_fromDb(dbT); assert(t); AB_Transaction_List_Add(t, iea->notedTransactions); dbT=GWEN_DB_FindNextGroup(dbT, "notedTransaction"); } } return iea; }
static int add_to_variable_list(char *text_line, FORMAT_PTR format) { VARIABLE_PTR var = NULL; char save_char = STR_END; char *token = NULL; char *endptr = NULL; int error = 0; if (!format->variables) { format->variables = dll_init(); if (!format->variables) return(ERR_MEM_LACK); } token = text_line; token = get_token(token, &save_char); if (FF_STRLEN(token)) { var = ff_create_variable(token); if (var == NULL) return ERR_MEM_LACK; #if 0 error = ERR_MEM_LACK; #endif if (var->name[0] == '"' && var->name[strlen(var->name) - 1] == '"') { memmove(var->name, var->name + 1, strlen(var->name) - 2); var->name[strlen(var->name) - 2] = STR_END; } } else { error = err_push(ERR_VARIABLE_DESC, "Expecting a variable name (\"%s\")", format->name); goto add_to_variable_list_exit; } if (!dll_add(format->variables)) { ff_destroy_variable(var); error = ERR_MEM_LACK; goto add_to_variable_list_exit; } dll_assign(var, DLL_VAR, dll_last(format->variables)); token = get_token(token, &save_char); if (FF_STRLEN(token)) { errno = 0; var->start_pos = strtol(token, &endptr, 10); if (errno || FF_STRLEN(endptr)) { error = err_push(errno ? errno : ERR_PARAM_VALUE, "Bad number for variable start position: %s", token); goto add_to_variable_list_exit; } } else { error = err_push(ERR_VARIABLE_DESC, "Expecting a start position for \"%s\"", var->name); goto add_to_variable_list_exit; } token = get_token(token, &save_char); if (FF_STRLEN(token)) { errno = 0; var->end_pos = strtol(token, &endptr, 10); if (errno || FF_STRLEN(endptr)) { error = err_push(errno ? errno : ERR_PARAM_VALUE, "Bad number for variable end position: %s", token); goto add_to_variable_list_exit; } } else { error = err_push(ERR_VARIABLE_DESC, "Expecting an end position for \"%s\"", var->name); goto add_to_variable_list_exit; } token = get_token(token, &save_char); if (FF_STRLEN(token)) { FFV_TYPE(var) = ff_lookup_number(variable_types, token); if (FFV_TYPE(var) == FF_VAR_TYPE_FLAG) { if (os_strncmpi("ARRAY", token, 5) == 0) { RESTORE_CHAR(token, save_char); save_char = STR_END; error = parse_array_variable(&token, var); if (error) goto add_to_variable_list_exit; format->type |= FF_ARRAY; } else { /* Is this a keyworded variable type? If so, remember name of keyword in record_title */ if (IS_KEYWORDED_PARAMETER(token)) { FFV_TYPE(var) = 0; assert(!var->record_title); if (var->record_title) memFree(var->record_title, "var->record_title"); var->record_title = (char *)memStrdup(token, "token"); if (!var->record_title) { error = err_push(ERR_MEM_LACK, ""); goto add_to_variable_list_exit; } } else { error = err_push(ERR_UNKNOWN_VAR_TYPE, token); goto add_to_variable_list_exit; } } } } else { error = err_push(ERR_VARIABLE_DESC, "Expecting a variable type or array description for \"%s\"", var->name); goto add_to_variable_list_exit; } token = get_token(token, &save_char); if (FF_STRLEN(token)) { errno = 0; var->precision = (short)strtol(token, &endptr, 10); if (errno || FF_STRLEN(endptr)) { error = err_push(errno ? errno : ERR_PARAM_VALUE, "Bad number for variable precision: %s", token); goto add_to_variable_list_exit; } } else { if (IS_ARRAY(var)) { error = err_push(ERR_VARIABLE_DESC, "Expecting a precision for \"%s\"", var->name); goto add_to_variable_list_exit; } } if (var->end_pos < var->start_pos) { error = err_push(ERR_VARIABLE_DESC,"End Position < Start Position\n%s", text_line); goto add_to_variable_list_exit; } /* Determine The Variable Type */ if (var->start_pos == 0 && var->end_pos == 0) { if (IS_BINARY(format)) { error = err_push(ERR_UNKNOWN_FORMAT_TYPE, "Illegal to have delimited binary format"); goto add_to_variable_list_exit; } else if (IS_ARRAY(format)) { error = err_push(ERR_UNKNOWN_FORMAT_TYPE, "Illegal to have delimited array format"); goto add_to_variable_list_exit; } format->type |= FFF_VARIED; } if (NEED_TO_CHECK_VARIABLE_SIZE(format, var)) { if (ffv_type_size(var->type) != var->end_pos - var->start_pos + 1) { char save_eol_char = STR_END; char *end_of_line = find_EOL(text_line); if (end_of_line) { save_eol_char = *end_of_line; *end_of_line = STR_END; } error = err_push(ERR_VARIABLE_SIZE,"Expecting ending position for binary field %s to be %d", var->name, var->start_pos + ffv_type_size(var->type) - 1); if (end_of_line) *end_of_line = save_eol_char; goto add_to_variable_list_exit; } } check_old_style_EOL_var(var); /* Does length of CONSTANT variable name equal length of variable? */ if (IS_CONSTANT(var) && !IS_EOL(var)) { if (FF_STRLEN(var->name) > FF_VAR_LENGTH(var)) { error = err_push(ERR_VARIABLE_SIZE, "Constant variable initializer (%s) is too long for field", var->name); goto add_to_variable_list_exit; } else if (FF_STRLEN(var->name) < FF_VAR_LENGTH(var)) error = err_push(ERR_WARNING_ONLY + ERR_VARIABLE_SIZE, "Constant variable initializer (%s) is shorter than field", var->name); } format->num_vars++; format->length = max(format->length, var->end_pos); add_to_variable_list_exit: if (error) { char *cp; char EOL_char = STR_END; /* Don't destroy variable since it will be destroyed in ff_destroy_format */ cp = find_EOL(text_line); if (cp) { EOL_char = *cp; *cp = STR_END; } error = err_push(ERR_VARIABLE_DESC + (error > ERR_WARNING_ONLY ? ERR_WARNING_ONLY : 0),text_line); if (cp) *cp = EOL_char; } RESTORE_CHAR(token, save_char); return(error); }
static int parse_array_variable ( char **array_desc_str, VARIABLE_PTR var ) { int error = 0; char *token = NULL; char save_char = STR_END; FF_TYPES_t var_type = FFV_NULL; FF_VALIDATE(var); FFV_TYPE(var) = FF_ARRAY; token = get_token(*array_desc_str, &save_char); while (strlen(token) && os_strcmpi(token, "OF")) token = get_token(*array_desc_str, &save_char); if (!strlen(token)) { char *cp = strrchr(*array_desc_str, ']'); if (!cp || os_strncmpi(cp + 1, "OF", 2)) return err_push(ERR_VARIABLE_DESC, "Expecting \"OF\" to end array description"); *token = save_char; token = cp + 1; save_char = token[2]; token[2] = STR_END; } *token++ = STR_END; var->array_desc_str = (char *)memStrdup(*array_desc_str, "var->array_desc_str"); if (!var->array_desc_str) return err_push(ERR_MEM_LACK, *array_desc_str); else os_str_trim_whitespace(var->array_desc_str, var->array_desc_str); token = get_token(token, &save_char); if (FF_STRLEN(token)) { var_type = ff_lookup_number(variable_types, token); if (var_type != FF_VAR_TYPE_FLAG) FFV_TYPE(var) |= var_type; else { FFV_TYPE(var) = FFV_RECORD; /* or assign FF_VAR_TYPE_KEYWORD? */ /* Is the array element type a Record type? (i.e., a format description?) Assume for the time being that it is, and error-out later... */ /* Remember the variable type, which can be a record title, keyword, or typo */ var->record_title = (char *)memStrdup(token, "var->record_title"); if (!var->record_title) error = err_push(ERR_MEM_LACK, ""); os_str_replace_char(var->record_title, '"', ' '); os_str_trim_whitespace(var->record_title, var->record_title); } } else { error = err_push(ERR_VARIABLE_DESC, "Expecting a variable type or a record format title for \"%s\"", var->name); } token = get_token(token, &save_char); RESTORE_CHAR(token, save_char); (*array_desc_str)[strlen(*array_desc_str)] = 'O'; /* The 'O' in "OF" */ *array_desc_str = token; return(error); }