/* Hey EMACS -*- linux-c -*- */
/* $Id$ */

/*  TiEmu - Tiemu Is an EMUlator
 *
 *  Copyright (c) 2005, Kevin Kofler
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
 */

/*
    ER_throw support
*/

#include <stdio.h>
#include <stdlib.h>

/* This table is converted and hand-edited from the TIGCC error.h. */
static struct {unsigned int id; const char *name;} erthrow_table[] = {
  {0, "ER_OK"},
  {1, "ER_EXIT"},
  {2, "ER_STOP"},
  {3, "ER_OFF"},
  {4, "ER_PRGM_STOP"},
  {9, "ER_NO_MSG"},
  {10, "ER_FUNC_DID_NOT_RETURN_VALUE"},
  {20, "ER_TEST_NOT_TRUE_OR_FALSE"},
  {30, "ER_ARG_CANNOT_BE_FOLDER"},
  {40, "ER_ARGUMENT"},
  {50, "ER_ARG_MISMATCH"},
  {60, "ER_EXPECTED_BOOL_OR_AGG"},
  {70, "ER_ARG_MUST_BE_DECIMAL"},
  {80, "ER_ARG_MUST_BE_LABEL"},
  {90, "ER_ARGUMENT_MUST_BE_LIST"},
  {100, "ER_ARG_MUST_BE_MATRIX"},
  {110, "ER_ARG_MUST_BE_PIC"},
  {120, "ER_ARG_MUST_BE_PIC_OR_STR"},
  {130, "ER_ARG_MUST_BE_STRING"},
  {140, "ER_EXPECTED_VAR"},
  {150, "ER_ARG_MUST_BE_EMPTY_FOLDER"},
  {160, "ER_EXPECTED_ALGEBRAIC"},
  {161, "ER_ASAP_TOO_LONG"},
  {163, "ER_ATTRIBUTE_NOT_FOUND"},
  {165, "ER_BATT_LOW"},
  {170, "ER_BOUND"},
  {180, "ER_BREAK"},
  {185, "ER_CHECKSUM"},
  {190, "ER_CIRCULAR_DEFINITION"},
  {200, "ER_INVALID_SUCH_THAT"},
  {210, "ER_DATATYPE"},
  {220, "ER_DEPENDENT_LIMIT"},
  {225, "ER_DIFF_EQ_SETUP"},
  {230, "ER_DIMENSION"},
  {240, "ER_NON_CONFORMING_LISTS"},
  {250, "ER_DIVBY0"},
  {260, "ER_DOMAIN"},
  {270, "ER_DUPLICATE_VAR_NAME"},
  {280, "ER_ELSE_WITHOUT_IF"},
  {290, "ER_ENDTRY_WITHOUT_ELSE"},
  {295, "ER_EXCESSIVE_ITERATION"},
  {300, "ER_EXPECTED_2OR3_ELEMENTS"},
  {305, "ER_EXPIRED"},
  {307, "ER_APP_EXT_NOT_FOUND"},
  {308, "ER_APP_NOT_FOUND"},
  {310, "ER_INVALID_NSOLVE_ARG1"},
  {320, "ER_INVALID_SOLVE_ARG1"},
  {330, "ER_FOLDER"},
  {335, "ER_FUNCS_IN_DIFF_EQ"},
  {345, "ER_INCONSISTENT_UNITS"},
  {350, "ER_INVALID_SUBSCRIPT"},
  {360, "ER_INVALID_INDIR_STRING"},
  {380, "ER_INVALID_ANS"},
  {390, "ER_ILLEGAL_ASSIGNMENT"},
  {400, "ER_ILLEGAL_ASSIGNMENT_VALUE"},
  {405, "ER_INVALID_AXES"},
  {410, "ER_ILLEGAL_COMMAND"},
  {420, "ER_INVALID_FOLDER_NAME"},
  {430, "ER_GRAPH_MODE"},
  {435, "ER_INVALID_GUESS"},
  {440, "ER_INVALID_IMPLIED_MULT"},
  {450, "ER_ILLEGAL_IN_FUNC"},
  {460, "ER_ILLEGAL_IN_CUSTOM"},
  {470, "ER_ILLEGAL_IN_DIALOG"},
  {480, "ER_ILLEGAL_IN_TOOLBAR"},
  {490, "ER_CANNOT_EXIT_FROM_TRY"},
  {500, "ER_INVALID_LABEL"},
  {510, "ER_INVALID_LIST_OR_MATRIX"},
  {520, "ER_INVAL_OUTSIDE_TB_CM"},
  {530, "ER_INVAL_OUTSIDE_DG_TB_CM"},
  {540, "ER_INVALID_OUTSIDE_DIALOG"},
  {550, "ER_MUST_BE_IN_PRGM_OR_FUNC"},
  {560, "ER_EXIT_NOT_IN_LOOP"},
  {570, "ER_INVALID_PATHNAME"},
  {575, "ER_INVALID_POLAR_COMPLEX"},
  {580, "ER_ILLEGAL_PRGM_REF"},
  {590, "ER_INVALID_SYNTAX_BLOCK"},
  {600, "ER_INVALID_TABLE"},
  {605, "ER_INVALID_USE_OF_UNITS"},
  {610, "ER_INVALID_LOCAL_DECLARATION"},
  {620, "ER_EXPECTED_VAR_OR_FUNC"},
  {630, "ER_INVALID_VAR_REF"},
  {640, "ER_INVALID_VECTOR_SYNTAX"},
  {650, "ER_LINK_IO"},
  {665, "ER_MAT_NOT_DIAGONALIZABLE"},
  {670, "ER_MEMORY"},
  {673, "ER_STACK_VIO"},
  {680, "ER_EXPECTED_LPAR"},
  {690, "ER_EXPECTED_RPAR"},
  {700, "ER_EXPECTED_DOUBLE_QUOTE"},
  {710, "ER_EXPECTED_RIGHT_BRACKET"},
  {720, "ER_EXPECTED_RIGHT_BRACE"},
  {730, "ER_INVALID_BLOCK_STRUCTURE"},
  {740, "ER_MISSING_THEN"},
  {750, "ER_NOT_FUNC_OR_PRGM"},
  {765, "ER_NO_FUNCS_SEL"},
  {780, "ER_NO_SOLUTION"},
  {790, "ER_NON_ALGEBRAIC_VARIABLE"},
  {800, "ER_UNREAL_RESULT"},
  {810, "ER_MEMORY_DML"},
  {830, "ER_OVERFLOW"},
  {840, "ER_STAT_PLOT"},
  {850, "ER_PRGM_NOT_FOUND"},
  {860, "ER_RECURSION_TOO_DEEP"},
  {870, "ER_RESERVED"},
  {875, "ER_ROM_ROUTINE_NOT_AVAILABLE"},
  {880, "ER_SEQUENCE_SETUP"},
  {885, "ER_SIGNATURE_ERR"},
  {890, "ER_SINGULARMAT"},
  {895, "ER_SLOPE_FIELD_FUNCS"},
  {900, "ER_EMPTY_GROUP_NOT_VALID"},
  {910, "ER_SYNTAX"},
  {930, "ER_TOO_FEW_ARGS"},
  {940, "ER_TOO_MANY_ARGS"},
  {950, "ER_TOO_MANY_SUBSCRIPTS"},
  {955, "ER_TOO_MANY_UNDEFINED"},
  {960, "ER_UNDEFINED_VAR"},
  {965, "ER_UNLICENSED"},
  {970, "ER_VAR_IN_USE"},
  {980, "ER_PROTECTED"},
  {990, "ER_NAME_TOO_LONG"},
  {1000, "ER_RANGE"},
  {1010, "ER_ZOOM"},
  {1020, "ER_ILLEGAL_TAG"},
  {1030, "ER_MEM_VIO"},
  {2048, NULL}
};

const char* ercodes_get_name(unsigned id)
{
	if(id >= 2048)
		return "Unknown ERROR code";
	else
	{
		unsigned n = sizeof(erthrow_table)/sizeof(*erthrow_table), lb = 0, ub = n-1;
		while (lb < ub - 1)	
		{
			unsigned mid = (lb + ub) >> 1;
			if (erthrow_table[mid].id <= id)
				lb = mid;
			else
				ub = mid;
		}
		if (id != erthrow_table[lb].id)
		{
			static char buffer[100];
			sprintf(buffer, "%s + %u", erthrow_table[lb].name,
			        id - erthrow_table[lb].id);
			return buffer;
		}
		else
			return erthrow_table[lb].name;
	}
}

