/* -*-C-*- ******************************************************************************** * * File: variables.c (Formerly variables.c) * Description: Variable handler for control flags * Author: Mark Seaman, OCR Technology * Created: Tue Dec 12 09:03:49 1989 * Modified: Thu Apr 4 11:01:37 1991 (Mark Seaman) marks@hpgrlt * Language: C * Package: N/A * Status: Experimental (Do Not Distribute) * * (c) Copyright 1989, Hewlett-Packard Company. ** Licensed under the Apache License, Version 2.0 (the "License"); ** you may not use this file except in compliance with the License. ** You may obtain a copy of the License at ** http://www.apache.org/licenses/LICENSE-2.0 ** Unless required by applicable law or agreed to in writing, software ** distributed under the License is distributed on an "AS IS" BASIS, ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ** See the License for the specific language governing permissions and ** limitations under the License. * *********************************************************************************/ /*---------------------------------------------------------------------- I n c l u d e s ----------------------------------------------------------------------*/ #include #include #include "variables.h" #include "callcpp.h" #include "listio.h" #include "globals.h" #include "scanutils.h" /*---------------------------------------------------------------------- V a r i a b l e s ----------------------------------------------------------------------*/ static LIST variable_list = NIL; //extern char *demodir; VALUE dummy; /*---------------------------------------------------------------------- Macros ----------------------------------------------------------------------*/ /********************************************************************** * scan_int * * Scan in an integer value from a string. It might be in decimal or * hex. Read it into "integer". **********************************************************************/ #define scan_int(stripped,integer) \ if (stripped [2] == 'x') \ sscanf (&stripped[3], "%x", &integer); \ else \ sscanf (&stripped[1], "%d", &integer) /*---------------------------------------------------------------------- F u n c t i o n s ----------------------------------------------------------------------*/ void free_variables() { destroy_nodes(variable_list, free); variable_list = NIL; } /********************************************************************** * add_ptr_variable * * Add a new ptr variable to the global variable list. Initalize its * value. **********************************************************************/ void add_ptr_variable(void *address, const char *string, VALUE default_value, variables_io reader, variables_io writer) { VARIABLE *this_var; this_var = (VARIABLE *) malloc (sizeof (VARIABLE)); this_var->address = address; this_var->string = string; this_var->default_value = default_value; this_var->type_reader = reader; this_var->type_writer = writer; *((void **) this_var->address) = default_value.ptr_part; variable_list = push (variable_list, this_var); } /********************************************************************** * add_32bit_variable * * Add a new 32bit variable to the global variable list. Initalize * its value. **********************************************************************/ void add_32bit_variable(void *address, const char *string, VALUE default_value, variables_io reader, variables_io writer) { VARIABLE *this_var; this_var = (VARIABLE *) malloc (sizeof (VARIABLE)); this_var->address = address; this_var->string = string; this_var->default_value = default_value; this_var->type_reader = reader; this_var->type_writer = writer; *((int *) this_var->address) = default_value.int_part; variable_list = push (variable_list, this_var); } /********************************************************************** * float_read * * Read an integer value and save it in a variable structure. **********************************************************************/ void float_read(VARIABLE *variable, char *string) { float f; #ifdef EMBEDDED // We have no sscanf with float functionality here *((float *) variable->address) = strtofloat(strip_line (string)); #else sscanf (strip_line (string), "%f", &f); *((float *) variable->address) = f; #endif } /********************************************************************** * float_write * * Read an integer value and save it in a variable structure. **********************************************************************/ void float_write(VARIABLE *variable, char *string) { float *f; f = (float *) variable->address; sprintf (string, "%s\t%4.2f", variable->string, *f); } /********************************************************************** * int_read * * Read an integer value and save it in a variable structure. **********************************************************************/ void int_read(VARIABLE *variable, char *string) { char *stripped; int integer; stripped = strip_line (string); /* Add the value */ if (stripped[0] == '+') { scan_int(stripped, integer); *((int *) variable->address) += integer; } else if (stripped[0] == '|') { scan_int(stripped, integer); *((int *) variable->address) = integer | *((int *) variable->address); } /* Subtract the value */ else if (stripped[0] == '_') { scan_int(stripped, integer); *((int *) variable->address) = (~integer) & *((int *) variable->address); } else { /* Set the value */ if (stripped[1] == 'x') { sscanf (&stripped[2], "%x", &integer); } else { sscanf (stripped, "%d", &integer); } *((int *) variable->address) = integer; } } /********************************************************************** * int_write * * Read an integer value and save it in a variable structure. **********************************************************************/ void int_write(VARIABLE *variable, char *string) { sprintf (string, "%s\t%d", variable->string, *((int *) variable->address)); } /********************************************************************** * read_variables * * Read a file that contains assignments for all the desired variables. * This type of file can be written using the function write_variables. **********************************************************************/ void read_variables(const char *filename) { int x = 0; char *this_string; LIST var_strings; char name[1024]; FILE *fp; VARIABLE *this_var; /* Read the strings */ if (filename == NULL || filename[0] == '\0') return; strcpy(name, demodir); strcat (name, "tessdata/tessconfigs/"); strcat(name, filename); if ((fp = fopen (name, "r")) == NULL) strcpy(name, filename); else fclose(fp); var_strings = read_list (name); iterate(var_strings) { /* Get the name string */ this_string = (char *) first (var_strings); if (this_string[0] != '#') { for (x = 0; x < strlen (this_string) && this_string[x] != ' ' && this_string[x] != '\t'; x++); this_string[x] = '\0'; /* Find variable record */ this_var = (VARIABLE *) first (search (variable_list, this_string, same_var_name)); if (this_var == 0) { cprintf ("error: Could not find variable '%s'\n", this_string); exit (1); //?err_exit (); } /* Read the value */ this_string[x] = '\t'; (*(this_var->type_reader)) (this_var, this_string); } } } /********************************************************************** * same_var_name * * Return TRUE if the VARIABLE has the name string in it. **********************************************************************/ int same_var_name(void *item1, //VARIABLE *variable, void *item2) { //char *string) VARIABLE *variable; char *string; variable = (VARIABLE *) item1; string = (char *) item2; if (strcmp (variable->string, string)) return (FALSE); else return (TRUE); } /********************************************************************** * string_read * * Read an integer value and save it in a variable structure. **********************************************************************/ void string_read(VARIABLE *variable, char *string) { char *value; value = strsave (strip_line (string)); *((char **) variable->address) = value; } /********************************************************************** * string_write * * Read an integer value and save it in a variable structure. **********************************************************************/ void string_write(VARIABLE *variable, char *string) { sprintf (string, "%s\t%s", variable->string, *((char **) variable->address)); } /********************************************************************** * strip_line * * Remove the name off the front of the line and strip the white space * before and after the value. **********************************************************************/ char *strip_line(char *string) { int x; int y; /* Skip over name */ for (x = 0; x < strlen (string) && string[x] != '\t' && string[x] != ' '; x++); /* Skip over whitespace */ while (x < strlen (string) && (string[x] == '\t' || string[x] == ' ')) x++; /* Strip trailing whitespace */ for (y = strlen (string); y >= 0 && (string[y - 1] == '\t' || string[y - 1] == ' '); y--) string[y] = '\0'; /* Return result */ return (&string[x]); }