/* * hre_api.c: Implementation of HRE API * Author: James & * Created On: Wed Dec 9 13:49:14 1992 * Last Modified By: James Kempf * Last Modified On: Fri Sep 23 13:49:04 1994 * Update Count: 137 * Copyright (c) 1994 by Sun Microsystems Computer Company * All rights reserved. * * Use and copying of this software and preparation of * derivative works based upon this software are permitted. * Any distribution of this software or derivative works * must comply with all applicable United States export control * laws. * * This software is made available as is, and Sun Microsystems * Computer Company makes no warranty about the software, its * performance, or its conformity to any specification */ #include <u.h>#include <libc.h>#include <draw.h>#include <scribble.h> #include "scribbleimpl.h"#include "hre_internal.h" /* ari -- prototype for rii function */recognizer __recognizer_internal_initialize(rec_info* ri); /*Version number of API.*/ char* REC_VERSION = "2.0"; /*Domain name for internationalized text.*/ #define INTL_DOMAIN "recognition_manager" /* XXX -- Intl Hack -- Jay & Ari */#define dgettext(domain, msg) (msg)#define bindtextdomain(dirname, domain) /* * These magic numbers are used to ensure the integrity of the * recognizer structure.*/ #define REC_MAGIC 0xfeed#define REC_END_MAGIC 0xbeef /*Check the recognizer for validity*/ #define RI_CHECK_MAGIC(rec) \ ( (rec != nil) && \ (((recognizer)rec)->recognizer_magic == REC_MAGIC) && \ (((recognizer)rec)->recognizer_end_magic == REC_END_MAGIC) &&\ (((recognizer)rec)->recognizer_version == REC_VERSION) ) /*The name of the initialization & finalization functions.*/ /* static char rii_name[] = "__recognizer_internal_initialize";static char rif_name[] = "__recognizer_internal_finalize"; */ /*User home directory for recognizer info.*//* ari -- changed USERRECHOME from ".recognizers" */#define HOME "HOME"#define USERRECHOME ".classifiers" /*Local functions*/ static char* shared_library_name(char* directory,char* locale,char* name);static rec_info* make_rec_info(char* directory,char* name,char** subset);static void delete_rec_info(rec_info* ri);static int check_for_user_home(void);static void intl_initialize(void); static void cleanup_rec_element(rec_element* re,bool delete_points_p); /*The last error.*/ static char* the_last_error = nil; static char *safe_malloc (int nbytes){ char *res = malloc(nbytes); if (res == nil) { sysfatal("malloc failure"); } return (res);} /* * Implementation of API functions*/ /* * recognizer_load - Load the recognizer matching the rec_info struct. * If name is not null, then load the recognizer having that name. Returns * the recognizer object, or null if it can't load the recognizer, and * sets errno to indicate why.*/ recognizer recognizer_load(char* directory, char* name, char** subset){ recognizer rec; /*the recognizer*/ rec_info* rinf; /*rec_info for recognizer information*/ static bool intl_init = false; /*true if recog. manager initted.*/ if( intl_init == false ) { intl_init = true; intl_initialize(); } /*The name takes precedence.*/ rinf = make_rec_info(directory, name, subset); if (rinf == nil) { the_last_error = dgettext(INTL_DOMAIN, "Ran out of memory during prelinking initialization."); return((recognizer)nil); } /* fprint(2, "Got past make_rec_info.\n"); */ /*Let recognition code create recognizer and initialize*/ rec = __recognizer_internal_initialize(rinf); if (rec == nil) { return((recognizer)nil); }/* fprint(2, "Did rii.\n"); */ /*Check whether it's been correctly initialized*/ if( rec->recognizer_load_state == nil || rec->recognizer_save_state == nil || rec->recognizer_load_dictionary == nil || rec->recognizer_save_dictionary == nil || rec->recognizer_free_dictionary == nil || rec->recognizer_add_to_dictionary == nil || rec->recognizer_delete_from_dictionary == nil || rec->recognizer_error == nil || rec->recognizer_set_context == nil || rec->recognizer_get_context == nil || rec->recognizer_clear == nil || rec->recognizer_get_buffer == nil || rec->recognizer_set_buffer == nil || rec->recognizer_translate == nil || rec->recognizer_get_extension_functions == nil || rec->recognizer_get_gesture_names == nil || rec->recognizer_set_gesture_action == nil ) { recognizer_unload(rec);/* fprint(2, "Unloading b/c null function pointer.\n"); */ the_last_error = dgettext(INTL_DOMAIN, "One or more recognizer function pointers is nil."); return((recognizer)nil); } /*Set the rec_info structure.*/ rec->recognizer_info = rinf; /*Check whether home directory is there for recognizer info.*/ /* * ari -- don't bother. We're not going to load from each user's * home directory at this point. Instead, we'll use a stupid * little a-b-c file because it loads FAST. * * if( check_for_user_home() < 0 ) { * recognizer_unload(rec); * return((recognizer)nil); * } */ /*We got it!*//* fprint(2, "Done.\n"); */ return(rec);} /* * recognizer_unload - Unload the recognizer.*/ intrecognizer_unload(recognizer rec){ /*Make sure magic numbers right.*/ if( !RI_CHECK_MAGIC(rec) ) { the_last_error = dgettext(INTL_DOMAIN,"Bad recognizer object."); return(-1); } return __recognizer_internal_finalize(rec);} /* * recognizer_load_state-Get any recognizer state associated with name * in dir. Note that name may not be simple file name, since * there may be more than one file involved. Return 0 if successful, * -1 if not.*/ int recognizer_load_state(recognizer rec, char* dir, char* name){ /*Make sure magic numbers right.*/ if( !RI_CHECK_MAGIC(rec) ) { the_last_error = dgettext(INTL_DOMAIN,"Bad recognizer object."); return(-1); } /*Do the function.*/ return(rec->recognizer_load_state(rec, dir, name));} /* * recognizer_save_state-Save any recognizer state to name * in dir. Note that name may not be a simple file name, since * there may be more than one file involved. Return 0 if successful, * -1 if not.*/ int recognizer_save_state(recognizer rec,char* dir,char* name){ /*Make sure magic numbers right.*/ if( !RI_CHECK_MAGIC(rec) ) { the_last_error = dgettext(INTL_DOMAIN,"Bad recognizer object."); return(-1); } /*Do the function.*/ return(rec->recognizer_save_state(rec,dir,name));} /* * recognizer_load_dictionary-Load dictionary, return pointer * to it, or nil if error.*/ wordset recognizer_load_dictionary(recognizer rec,char* dir,char* name){ /*Make sure magic numbers right.*/ if( !RI_CHECK_MAGIC(rec) ) { the_last_error = dgettext(INTL_DOMAIN,"Bad recognizer object."); return(nil); } /*Do the function.*/ return(rec->recognizer_load_dictionary(rec,dir,name));} /* * recognizer_save_dictionary-Save the dictionary to the file, return 0 if * OK, -1 if error.*/ int recognizer_save_dictionary(recognizer rec,char* dir,char* name,wordset dict){ /*Make sure magic numbers right.*/ if( !RI_CHECK_MAGIC(rec) ) { the_last_error = dgettext(INTL_DOMAIN,"Bad recognizer object."); return(-1); } /*Do the function.*/ return(rec->recognizer_save_dictionary(rec,dir,name,dict));} /* * recognizer_free_dictionary-Free the dictionary, return 0 if * OK, -1 if error.*/ int recognizer_free_dictionary(recognizer rec,wordset dict){ /*Make sure magic numbers right.*/ if( !RI_CHECK_MAGIC(rec) ) { the_last_error = dgettext(INTL_DOMAIN,"Bad recognizer object."); return(-1); } /*Do the function.*/ return(rec->recognizer_free_dictionary(rec,dict));} /* * recognizer_add_to_dictionary-Add word to the dictionary, * return 0 if OK, -1 if error.*/ int recognizer_add_to_dictionary(recognizer rec,letterset* word,wordset dict){ /*Make sure magic numbers right.*/ if( !RI_CHECK_MAGIC(rec) ) { the_last_error = dgettext(INTL_DOMAIN,"Bad recognizer object."); return(-1); } /*Do the function.*/ return(rec->recognizer_add_to_dictionary(rec,word,dict));} /* * recognizer_delete_from_dictionary-Delete word from the dictionary, * return 0 if OK, -1 if error.*/ int recognizer_delete_from_dictionary(recognizer rec,letterset* word,wordset dict){ /*Make sure magic numbers right.*/ if( !RI_CHECK_MAGIC(rec) ) { the_last_error = dgettext(INTL_DOMAIN,"Bad recognizer object."); return(-1); } /*Do the function.*/ return(rec->recognizer_delete_from_dictionary(rec,word,dict));} /* * recognizer_get_info-Get a pointers to the rec_info * giving the locales and subsets supported by the recognizer * and the shared library pathname.*/ const rec_info*recognizer_get_info(recognizer rec){ /*Make sure magic numbers right.*/ if( !RI_CHECK_MAGIC(rec) ) { the_last_error = dgettext(INTL_DOMAIN,"Bad recognizer object."); return((rec_info*)nil); } /*Return the rec_info object.*/ return(rec->recognizer_info);} /* * recognizer_manager_version-Return the version number string of the * recognition manager.*/ const char* recognizer_manager_version(recognizer rec){ /*Make sure magic numbers right.*/ if( !RI_CHECK_MAGIC(rec) ) { the_last_error = dgettext(INTL_DOMAIN,"Bad recognizer object."); return(nil); } return(rec->recognizer_version); }/* * recognizer_error-Return the last error message, or nil if none.*/ char* recognizer_error(recognizer rec){ /*Make sure magic numbers right and function there.*/ if( !RI_CHECK_MAGIC(rec) && the_last_error == nil ) { return(dgettext(INTL_DOMAIN,"Bad recognizer object.")); } else if( the_last_error != nil ) { char* error = the_last_error; the_last_error = nil; return(error); } /*Do the function.*/ return(rec->recognizer_error(rec));} /* * recognizer_set_context-Set the recognition context for translation. * Return 0 if successful, -1 if error.*/ int recognizer_set_context(recognizer rec,rc* rec_xt){ /*Make sure magic numbers right.*/ if( !RI_CHECK_MAGIC(rec) ) { the_last_error = dgettext(INTL_DOMAIN,"Bad recognizer object."); return(-1); } /*Do the function.*/ return(rec->recognizer_set_context(rec,rec_xt));} /* * recognzier_get_context-Get the recognition context for translation. * If none or error, return nil.*/ rc* recognizer_get_context(recognizer rec){ /*Make sure magic numbers right.*/ if( !RI_CHECK_MAGIC(rec) ) { the_last_error = dgettext(INTL_DOMAIN,"Bad recognizer object."); return(nil); } /*Do the function.*/ return(rec->recognizer_get_context(rec));} /* * recognizer_clear-Clear buffer and recognition context. * Return 0 if success, else -1.*/ int recognizer_clear(recognizer rec,bool delete_points_p){ /*Make sure magic numbers right.*/ if( !RI_CHECK_MAGIC(rec) ) { the_last_error = dgettext(INTL_DOMAIN,"Bad recognizer object."); return(-1); } /*Do the function.*/ return(rec->recognizer_clear(rec,delete_points_p));} /*recognizer_get_buffer-Get stroke buffer. Return 0 if success, else -1.*/ int recognizer_get_buffer(recognizer rec, uint* nstrokes,Stroke** strokes){ /*Make sure magic numbers right.*/ if( !RI_CHECK_MAGIC(rec) ) { the_last_error = dgettext(INTL_DOMAIN,"Bad recognizer object."); return(-1); } /*Do the function.*/ return(rec->recognizer_get_buffer(rec,nstrokes,strokes)); } /* * recognizer_set_buffer-Set stroke buffer to arg. Return 0 if success, else * return -1.*/ int recognizer_set_buffer(recognizer rec,uint nstrokes,Stroke* strokes){ /*Make sure magic numbers right.*/ if( !RI_CHECK_MAGIC(rec) ) { the_last_error = dgettext(INTL_DOMAIN,"Bad recognizer object."); return(-1); } /*Do the function.*/ Lines 1–500 of 1300. Load more
/* * hre_api.c: Implementation of HRE API * Author: James & * Created On: Wed Dec 9 13:49:14 1992 * Last Modified By: James Kempf * Last Modified On: Fri Sep 23 13:49:04 1994 * Update Count: 137 * Copyright (c) 1994 by Sun Microsystems Computer Company * All rights reserved. * * Use and copying of this software and preparation of * derivative works based upon this software are permitted. * Any distribution of this software or derivative works * must comply with all applicable United States export control * laws. * * This software is made available as is, and Sun Microsystems * Computer Company makes no warranty about the software, its * performance, or its conformity to any specification */ #include <u.h> #include <libc.h> #include <draw.h> #include <scribble.h> #include "scribbleimpl.h" #include "hre_internal.h" /* ari -- prototype for rii function */ recognizer __recognizer_internal_initialize(rec_info* ri); /*Version number of API.*/ char* REC_VERSION = "2.0"; /*Domain name for internationalized text.*/ #define INTL_DOMAIN "recognition_manager" /* XXX -- Intl Hack -- Jay & Ari */ #define dgettext(domain, msg) (msg) #define bindtextdomain(dirname, domain) /* * These magic numbers are used to ensure the integrity of the * recognizer structure. */ #define REC_MAGIC 0xfeed #define REC_END_MAGIC 0xbeef /*Check the recognizer for validity*/ #define RI_CHECK_MAGIC(rec) \ ( (rec != nil) && \ (((recognizer)rec)->recognizer_magic == REC_MAGIC) && \ (((recognizer)rec)->recognizer_end_magic == REC_END_MAGIC) &&\ (((recognizer)rec)->recognizer_version == REC_VERSION) ) /*The name of the initialization & finalization functions.*/ /* static char rii_name[] = "__recognizer_internal_initialize"; static char rif_name[] = "__recognizer_internal_finalize"; */ /*User home directory for recognizer info.*/ /* ari -- changed USERRECHOME from ".recognizers" */ #define HOME "HOME" #define USERRECHOME ".classifiers" /*Local functions*/ static char* shared_library_name(char* directory,char* locale,char* name); static rec_info* make_rec_info(char* directory,char* name,char** subset); static void delete_rec_info(rec_info* ri); static int check_for_user_home(void); static void intl_initialize(void); static void cleanup_rec_element(rec_element* re,bool delete_points_p); /*The last error.*/ static char* the_last_error = nil; static char *safe_malloc (int nbytes) { char *res = malloc(nbytes); if (res == nil) { sysfatal("malloc failure"); } return (res); } /* * Implementation of API functions */ /* * recognizer_load - Load the recognizer matching the rec_info struct. * If name is not null, then load the recognizer having that name. Returns * the recognizer object, or null if it can't load the recognizer, and * sets errno to indicate why. */ recognizer recognizer_load(char* directory, char* name, char** subset) { recognizer rec; /*the recognizer*/ rec_info* rinf; /*rec_info for recognizer information*/ static bool intl_init = false; /*true if recog. manager initted.*/ if( intl_init == false ) { intl_init = true; intl_initialize(); } /*The name takes precedence.*/ rinf = make_rec_info(directory, name, subset); if (rinf == nil) { the_last_error = dgettext(INTL_DOMAIN, "Ran out of memory during prelinking initialization."); return((recognizer)nil); } /* fprint(2, "Got past make_rec_info.\n"); */ /*Let recognition code create recognizer and initialize*/ rec = __recognizer_internal_initialize(rinf); if (rec == nil) { return((recognizer)nil); } /* fprint(2, "Did rii.\n"); */ /*Check whether it's been correctly initialized*/ if( rec->recognizer_load_state == nil || rec->recognizer_save_state == nil || rec->recognizer_load_dictionary == nil || rec->recognizer_save_dictionary == nil || rec->recognizer_free_dictionary == nil || rec->recognizer_add_to_dictionary == nil || rec->recognizer_delete_from_dictionary == nil || rec->recognizer_error == nil || rec->recognizer_set_context == nil || rec->recognizer_get_context == nil || rec->recognizer_clear == nil || rec->recognizer_get_buffer == nil || rec->recognizer_set_buffer == nil || rec->recognizer_translate == nil || rec->recognizer_get_extension_functions == nil || rec->recognizer_get_gesture_names == nil || rec->recognizer_set_gesture_action == nil ) { recognizer_unload(rec); /* fprint(2, "Unloading b/c null function pointer.\n"); */ the_last_error = dgettext(INTL_DOMAIN, "One or more recognizer function pointers is nil."); return((recognizer)nil); } /*Set the rec_info structure.*/ rec->recognizer_info = rinf; /*Check whether home directory is there for recognizer info.*/ /* * ari -- don't bother. We're not going to load from each user's * home directory at this point. Instead, we'll use a stupid * little a-b-c file because it loads FAST. * * if( check_for_user_home() < 0 ) { * recognizer_unload(rec); * return((recognizer)nil); * } */ /*We got it!*/ /* fprint(2, "Done.\n"); */ return(rec); } /* * recognizer_unload - Unload the recognizer. */ int recognizer_unload(recognizer rec) { /*Make sure magic numbers right.*/ if( !RI_CHECK_MAGIC(rec) ) { the_last_error = dgettext(INTL_DOMAIN,"Bad recognizer object."); return(-1); } return __recognizer_internal_finalize(rec); } /* * recognizer_load_state-Get any recognizer state associated with name * in dir. Note that name may not be simple file name, since * there may be more than one file involved. Return 0 if successful, * -1 if not. */ int recognizer_load_state(recognizer rec, char* dir, char* name) { /*Make sure magic numbers right.*/ if( !RI_CHECK_MAGIC(rec) ) { the_last_error = dgettext(INTL_DOMAIN,"Bad recognizer object."); return(-1); } /*Do the function.*/ return(rec->recognizer_load_state(rec, dir, name)); } /* * recognizer_save_state-Save any recognizer state to name * in dir. Note that name may not be a simple file name, since * there may be more than one file involved. Return 0 if successful, * -1 if not. */ int recognizer_save_state(recognizer rec,char* dir,char* name) { /*Make sure magic numbers right.*/ if( !RI_CHECK_MAGIC(rec) ) { the_last_error = dgettext(INTL_DOMAIN,"Bad recognizer object."); return(-1); } /*Do the function.*/ return(rec->recognizer_save_state(rec,dir,name)); } /* * recognizer_load_dictionary-Load dictionary, return pointer * to it, or nil if error. */ wordset recognizer_load_dictionary(recognizer rec,char* dir,char* name) { /*Make sure magic numbers right.*/ if( !RI_CHECK_MAGIC(rec) ) { the_last_error = dgettext(INTL_DOMAIN,"Bad recognizer object."); return(nil); } /*Do the function.*/ return(rec->recognizer_load_dictionary(rec,dir,name)); } /* * recognizer_save_dictionary-Save the dictionary to the file, return 0 if * OK, -1 if error. */ int recognizer_save_dictionary(recognizer rec,char* dir,char* name,wordset dict) { /*Make sure magic numbers right.*/ if( !RI_CHECK_MAGIC(rec) ) { the_last_error = dgettext(INTL_DOMAIN,"Bad recognizer object."); return(-1); } /*Do the function.*/ return(rec->recognizer_save_dictionary(rec,dir,name,dict)); } /* * recognizer_free_dictionary-Free the dictionary, return 0 if * OK, -1 if error. */ int recognizer_free_dictionary(recognizer rec,wordset dict) { /*Make sure magic numbers right.*/ if( !RI_CHECK_MAGIC(rec) ) { the_last_error = dgettext(INTL_DOMAIN,"Bad recognizer object."); return(-1); } /*Do the function.*/ return(rec->recognizer_free_dictionary(rec,dict)); } /* * recognizer_add_to_dictionary-Add word to the dictionary, * return 0 if OK, -1 if error. */ int recognizer_add_to_dictionary(recognizer rec,letterset* word,wordset dict) { /*Make sure magic numbers right.*/ if( !RI_CHECK_MAGIC(rec) ) { the_last_error = dgettext(INTL_DOMAIN,"Bad recognizer object."); return(-1); } /*Do the function.*/ return(rec->recognizer_add_to_dictionary(rec,word,dict)); } /* * recognizer_delete_from_dictionary-Delete word from the dictionary, * return 0 if OK, -1 if error. */ int recognizer_delete_from_dictionary(recognizer rec,letterset* word,wordset dict) { /*Make sure magic numbers right.*/ if( !RI_CHECK_MAGIC(rec) ) { the_last_error = dgettext(INTL_DOMAIN,"Bad recognizer object."); return(-1); } /*Do the function.*/ return(rec->recognizer_delete_from_dictionary(rec,word,dict)); } /* * recognizer_get_info-Get a pointers to the rec_info * giving the locales and subsets supported by the recognizer * and the shared library pathname. */ const rec_info* recognizer_get_info(recognizer rec) { /*Make sure magic numbers right.*/ if( !RI_CHECK_MAGIC(rec) ) { the_last_error = dgettext(INTL_DOMAIN,"Bad recognizer object."); return((rec_info*)nil); } /*Return the rec_info object.*/ return(rec->recognizer_info); } /* * recognizer_manager_version-Return the version number string of the * recognition manager. */ const char* recognizer_manager_version(recognizer rec) { /*Make sure magic numbers right.*/ if( !RI_CHECK_MAGIC(rec) ) { the_last_error = dgettext(INTL_DOMAIN,"Bad recognizer object."); return(nil); } return(rec->recognizer_version); } /* * recognizer_error-Return the last error message, or nil if none. */ char* recognizer_error(recognizer rec) { /*Make sure magic numbers right and function there.*/ if( !RI_CHECK_MAGIC(rec) && the_last_error == nil ) { return(dgettext(INTL_DOMAIN,"Bad recognizer object.")); } else if( the_last_error != nil ) { char* error = the_last_error; the_last_error = nil; return(error); } /*Do the function.*/ return(rec->recognizer_error(rec)); } /* * recognizer_set_context-Set the recognition context for translation. * Return 0 if successful, -1 if error. */ int recognizer_set_context(recognizer rec,rc* rec_xt) { /*Make sure magic numbers right.*/ if( !RI_CHECK_MAGIC(rec) ) { the_last_error = dgettext(INTL_DOMAIN,"Bad recognizer object."); return(-1); } /*Do the function.*/ return(rec->recognizer_set_context(rec,rec_xt)); } /* * recognzier_get_context-Get the recognition context for translation. * If none or error, return nil. */ rc* recognizer_get_context(recognizer rec) { /*Make sure magic numbers right.*/ if( !RI_CHECK_MAGIC(rec) ) { the_last_error = dgettext(INTL_DOMAIN,"Bad recognizer object."); return(nil); } /*Do the function.*/ return(rec->recognizer_get_context(rec)); } /* * recognizer_clear-Clear buffer and recognition context. * Return 0 if success, else -1. */ int recognizer_clear(recognizer rec,bool delete_points_p) { /*Make sure magic numbers right.*/ if( !RI_CHECK_MAGIC(rec) ) { the_last_error = dgettext(INTL_DOMAIN,"Bad recognizer object."); return(-1); } /*Do the function.*/ return(rec->recognizer_clear(rec,delete_points_p)); } /*recognizer_get_buffer-Get stroke buffer. Return 0 if success, else -1.*/ int recognizer_get_buffer(recognizer rec, uint* nstrokes,Stroke** strokes) { /*Make sure magic numbers right.*/ if( !RI_CHECK_MAGIC(rec) ) { the_last_error = dgettext(INTL_DOMAIN,"Bad recognizer object."); return(-1); } /*Do the function.*/ return(rec->recognizer_get_buffer(rec,nstrokes,strokes)); } /* * recognizer_set_buffer-Set stroke buffer to arg. Return 0 if success, else * return -1. */ int recognizer_set_buffer(recognizer rec,uint nstrokes,Stroke* strokes) { /*Make sure magic numbers right.*/ if( !RI_CHECK_MAGIC(rec) ) { the_last_error = dgettext(INTL_DOMAIN,"Bad recognizer object."); return(-1); } /*Do the function.*/