aboutsummaryrefslogtreecommitdiff
path: root/core/bgdc/src/error.c
diff options
context:
space:
mode:
Diffstat (limited to 'core/bgdc/src/error.c')
-rw-r--r--core/bgdc/src/error.c204
1 files changed, 204 insertions, 0 deletions
diff --git a/core/bgdc/src/error.c b/core/bgdc/src/error.c
new file mode 100644
index 0000000..f18551e
--- /dev/null
+++ b/core/bgdc/src/error.c
@@ -0,0 +1,204 @@
+/*
+ * Copyright © 2006-2016 SplinterGU (Fenix/Bennugd)
+ * Copyright © 2002-2006 Fenix Team (Fenix)
+ * Copyright © 1999-2002 José Luis Cebrián Pagüe (Fenix)
+ *
+ * This file is part of Bennu - Game Development
+ *
+ * This software is provided 'as-is', without any express or implied
+ * warranty. In no event will the authors be held liable for any damages
+ * arising from the use of this software.
+ *
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ *
+ * 1. The origin of this software must not be misrepresented; you must not
+ * claim that you wrote the original software. If you use this software
+ * in a product, an acknowledgment in the product documentation would be
+ * appreciated but is not required.
+ *
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ * misrepresented as being the original software.
+ *
+ * 3. This notice may not be removed or altered from any source
+ * distribution.
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "bgdc.h"
+#include "errors.h"
+#include "files.h"
+
+/* Errors indexed table */
+struct _errindex errtable[10] ;
+
+/*
+ * Generate & populate the error table
+ */
+
+void err_buildErrorTable()
+{
+
+ file * fp ;
+ char fname[64] ;
+ char line[1024] ;
+ char * token ;
+ int code ;
+ int size ;
+ char * msg = NULL ;
+ struct _errmsg * err = NULL ;
+ int len;
+
+ /* open the desired localized error file, check for existence if not open EN default */
+ strcpy( fname, "msg/" ) ;
+ strcat( fname, langinfo ) ;
+ strcat( fname, ".msg" ) ;
+
+ if ( !file_exists( fname ) ) strcpy( fname, "msg/en.msg" ) ;
+
+ fp = file_open( fname, "r" ) ;
+
+ if ( fp )
+ {
+ while ( !file_eof( fp ) )
+ {
+ len = file_qgets( fp, line, 1024 );
+ if ( file_eof( fp ) ) break;
+ if ( !len ) continue;
+ /* Check for multiline... */
+ if ( line[0] == '_' )
+ {
+ /* must resize the string and concatenate */
+ if ( err )
+ {
+ size = strlen( err->msg ) + strlen( line ) ;
+ msg = ( char * )calloc( size, sizeof( char ) ) ;
+ strcpy( msg, err->msg ) ;
+ line[0] = '\n' ;
+ strcat( msg, line ) ;
+ free( err->msg ) ;
+ err->msg = strdup( msg ) ;
+ }
+ }
+ else
+ {
+ /* Check for comment */
+ token = strtok( line, "#" ) ;
+ code = 0 ;
+ while ( token != NULL )
+ {
+ /* don't process comments */
+ if ( strlen( token ) == 0 ) break ;
+ if ( !code ) code = atoi( token ) ;
+ else msg = token ;
+ token = strtok( NULL, "#" ) ;
+ }
+ if ( code ) err = err_addError( code, msg ) ;
+ }
+ }
+ file_close( fp ) ;
+ }
+}
+
+struct _errmsg * err_addError( int code, const char * msg )
+{
+
+ int idx ;
+ struct _errmsg * err ;
+ struct _errmsg * cerr ;
+
+ /* build error object */
+
+ err = calloc( 1, sizeof( struct _errmsg ) ) ;
+ if ( err )
+ {
+ err->code = code ;
+ err->msg = strdup( msg ) ;
+ err->prev = NULL ;
+ err->next = NULL ;
+
+ /* determine index to use... */
+ idx = code / 100 ;
+
+ /* find insertion point */
+
+ cerr = errtable[idx].errlist ;
+
+ if ( cerr )
+ {
+ while ( cerr->next ) cerr = cerr->next ;
+ cerr->next = err ;
+ err->prev = cerr ;
+ }
+ else
+ {
+ errtable[idx].errlist = err ;
+ }
+
+ errtable[idx].count++ ;
+ }
+
+ return err ;
+}
+
+void err_delError( struct _errmsg * err )
+{
+
+ int idx ;
+
+ if ( !err ) return ;
+
+ idx = err->code / 100 ;
+
+ if ( err->next )
+ {
+ err->next->prev = err->prev ;
+ }
+
+ if ( err->prev )
+ err->prev->next = err->next ;
+ else
+ errtable[idx].errlist = err->next ;
+
+ free( err->msg ) ;
+ free( err ) ;
+
+ errtable[idx].count-- ;
+
+}
+
+void err_destroyErrorTable( void )
+{
+
+ int i ;
+
+ for ( i = 0;i < 10;i++ )
+ {
+ while ( errtable[i].count > 0 )
+ {
+ err_delError( errtable[i].errlist ) ;
+ }
+ }
+}
+
+const char * err_getErrorByCode( int code )
+{
+
+ int idx ;
+ struct _errmsg * err ;
+
+ idx = code / 100 ;
+
+ err = errtable[idx].errlist ;
+
+ while ( err && err->code != code ) err = err->next ;
+
+ if ( !err ) return 0 ;
+
+ return err->msg ;
+}