00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include "econfig.h"
00026 #include "dbl_format.h"
00027 #include "dbl_qsopt.h"
00028 #include "dbl_iqsutil.h"
00029
00030 int dbl_ILLformat_error_create (
00031 dbl_qsformat_error * error,
00032 int mode,
00033 const char *desc,
00034 int lineNum,
00035 const char *theLine,
00036 int atPos)
00037 {
00038 int len;
00039 int rval = 0;
00040
00041 error->theLine = NULL;
00042 error->desc = NULL;
00043 error->next = NULL;
00044
00045 ILL_FAILtrue (desc == NULL, "non empty error desc please");
00046 ILL_FAILtrue (mode >= QS_INPUT_NERROR
00047 || mode < 0, "0<= mode <=QS_INPUT_NERROR");
00048 error->type = mode;
00049 len = strlen (desc);
00050 ILL_SAFE_MALLOC (error->desc, len + 1, char);
00051
00052 strcpy (error->desc, desc);
00053 error->lineNumber = lineNum;
00054 if (theLine != NULL)
00055 {
00056 len = strlen (theLine);
00057 ILL_SAFE_MALLOC (error->theLine, len + 2, char);
00058
00059 strcpy (error->theLine, theLine);
00060 if (error->theLine[len - 1] != '\n')
00061 {
00062 error->theLine[len] = '\n';
00063 error->theLine[len + 1] = '\0';
00064 }
00065 }
00066 error->at = atPos;
00067 CLEANUP:
00068 if (rval)
00069 {
00070 dbl_ILLformat_error_delete (error);
00071 }
00072 return rval;
00073 }
00074
00075 void dbl_ILLformat_error_delete (
00076 dbl_qsformat_error * error)
00077 {
00078 ILL_IFFREE (error->desc, char);
00079 ILL_IFFREE (error->theLine, char);
00080 }
00081
00082 void dbl_ILLformat_error_print (
00083 FILE * out,
00084 dbl_qsformat_error * error)
00085 {
00086 int at = error->at;
00087 int tp = error->type;
00088 const char *type = "Error";
00089 const char *line = NULL;
00090 int i;
00091
00092 type = dbl_QSformat_error_type_string (tp);
00093
00094 fprintf (out, "%s line %d pos %d\n",
00095 type, dbl_QSerror_get_line_number (error), at);
00096 line = dbl_QSerror_get_line (error);
00097 if (line != NULL)
00098 {
00099 fprintf (out, "LINE %s", line);
00100 if (at >= 0)
00101 {
00102 fprintf (out, ".....");
00103 for (i = 0; i <= (at - 1); i++)
00104 {
00105 if (line[i] == '\t')
00106 {
00107 fputc ('\t', out);
00108 }
00109 else
00110 {
00111 fputc ('.', out);
00112 }
00113 }
00114 fprintf (out, "^\n");
00115 }
00116 }
00117 else
00118 {
00119 fprintf (out, "NO LINE\n");
00120 }
00121 fprintf (out, "MSG: %s\n", dbl_QSerror_get_desc (error));
00122 }
00123
00124
00125 dbl_qserror_collector *dbl_ILLerror_collector_new (
00126 dbl_qsadd_error_fct fct,
00127 void *dest)
00128 {
00129 int rval = 0;
00130 dbl_qserror_collector *c = NULL;
00131
00132 ILL_SAFE_MALLOC (c, 1, dbl_qserror_collector);
00133 c->add_error = fct;
00134 c->dest = dest;
00135
00136 CLEANUP:
00137 if (rval)
00138 {
00139 ILL_IFFREE (c, dbl_qserror_collector);
00140 }
00141 return c;
00142 }
00143
00144 dbl_qserror_collector *dbl_ILLerror_memory_collector_new (
00145 dbl_qserror_memory * dest)
00146 {
00147 return dbl_ILLerror_collector_new (dbl_ILLadd_error_to_memory, dest);
00148 }
00149
00150 void dbl_ILLerror_collector_free (
00151 dbl_qserror_collector * c)
00152 {
00153 ILL_IFFREE (c, dbl_qserror_collector);
00154 }
00155
00156 dbl_qserror_memory *dbl_ILLerror_memory_create (
00157 int takeErrorLines)
00158 {
00159 int rval = 0, i;
00160 dbl_qserror_memory *mem = NULL;
00161
00162 ILL_SAFE_MALLOC (mem, 1, dbl_qserror_memory);
00163 for (i = 0; i < QS_INPUT_NERROR; i++)
00164 {
00165 mem->has_error[i] = 0;
00166 }
00167 mem->error_list = NULL;
00168 mem->nerror = 0;
00169 mem->hasErrorLines = takeErrorLines;
00170 CLEANUP:
00171 return mem;
00172 }
00173
00174 void dbl_ILLerror_memory_free (
00175 dbl_qserror_memory * mem)
00176 {
00177 dbl_qsformat_error *ths, *nxt;
00178
00179 if (mem != NULL)
00180 {
00181 ths = mem->error_list;
00182 while (ths != NULL)
00183 {
00184 nxt = ths->next;
00185 ILL_IFFREE (ths, dbl_qsformat_error);
00186 ths = nxt;
00187 }
00188 ILL_IFFREE (mem, dbl_qserror_memory);
00189 }
00190 }
00191
00192 int dbl_ILLadd_error_to_memory (
00193 void *dest,
00194 const dbl_qsformat_error * error)
00195 {
00196 int rval = 0;
00197 dbl_qserror_memory *mem = (dbl_qserror_memory *) dest;
00198 dbl_qsformat_error *e = 0;
00199
00200 ILL_CHECKnull (mem, "must give non NULL dbl_qserror_memory");
00201
00202 ILL_SAFE_MALLOC (e, 1, dbl_qsformat_error);
00203 rval = dbl_ILLformat_error_create (e, error->type, error->desc,
00204 error->lineNumber,
00205 (mem->hasErrorLines) ? error->theLine : NULL,
00206 error->at);
00207 ILL_CLEANUP_IF (rval);
00208 e->next = mem->error_list;
00209 mem->error_list = e;
00210 mem->nerror++;
00211 mem->has_error[error->type]++;
00212
00213 CLEANUP:
00214 if (rval)
00215 {
00216 dbl_ILLformat_error_delete (e);
00217 ILL_IFFREE (e, dbl_qsformat_error);
00218 }
00219 return rval;
00220 }