/*******************************************/
/*  *** HAPPy Pascal compiler ***          */
/*         error messege                   */
/*            output routine               */
/*                                         */
/*       void pcerr(int,char*)             */
/*       char *inttoch(long)               */
/*                                         */
/*       Copyright (c) H.Asano 1992,1994.  */
/*******************************************/

#define EXTERN extern
#include "stdio.h"
#include "pascomp.h"

/***************************************/
/*   エラーメッセージ定義              */
/***************************************/
const struct _errmsg {
       int  msgno       ;               /* error message number       */
       char *errmsg     ;               /* error message              */
     } errtb[]  =  {
     {1  , "単純型に誤りがある"},
     {2  , "名前がない"},
     {3  , "最初に現れる記号が'program'でない"},
     {4  , "')'がない"},
     {5  , "':'がない"},
     {6  , "不当な記号が現れた"},
     {7  , "引数の並びに誤りがある"},
     {8  , "ofがない"},
     {9  , "'('がない"},
     {10 , "型の記述に誤りがある"},
     {11 , "'['がない"},
     {12 , "']'がない"},
     {13 , "endがない"},
     {14 , "';'がない"},
     {16 , "'='がない"},
     {17 , "beginがない"},
     {18 , "宣言部に誤りがある"},
     {19 , "欄の並びに誤りがある"},
     {20 , "','がない"},
     {21 , "'.'がない"},
     {22 , "'..'がない"},
     {30,  "不当文字(%s)が現れた"},
     {49,  " 代入には '=' でなく ':=' を使うこと"},
     {50 , "定数に誤りがある"},
     {51 , "':='がない"},
     {52 , "thenがない"},
     {53 , "untilがない"},
     {54 , "doがない"},
     {55 , "toあるいはdowntoがない"},
     {58 , "項に誤りがある"},
     {59 , "変数に誤りがある"},
     {100, "名前(%s)が宣言よりも先に参照されている"},
     {101, "名前(%s)が再度宣言された"},
     {102, "下限が上限より大きい"},
     {103, "名前(%s)の持つ意味が適当でない"},
     {104, "名前(%s)が宣言されていない"},
     {105, "定数名(%s)には符号がつけられない"},
     {106, "符号のあとが数でない"},
     {107, "部分範囲型の上限と下限の定数の型が一致してしない"},
     {109, "部分範囲型の定数の型が順序型でない"},
     {110, "タグ型は順序型でなければならない"},
     {111, "可変要素の定数がタグ型の値でない"},
     {112, "ファイルの要素型が代入可能なものでない"},
     {113, "添字型は順序型でなければならない"},
     {115, "集合の基底型が順序型でない"},
     {116, "標準手続き(%s)の引数に誤りがある"},
     {117, "型名(%s)の前方参照が解決されていない"},
     {118, "前方宣言された手続き/関数(%s)の実体が定義されていない"},
     {119, "前方宣言されているのでここでは引数の並びは書けない"},
     {120, "関数(%s)の結果型が順序型､実数型､ポインタ型でない"},
     {121, "仮値引数の型がファイルの要素型として許されるものでない"},
     {122, "関数(%s)は前方宣言されているのでここに結果型を書けない"},
     {123, "関数(%s)の宣言に結果型がない"},
     {125, "標準関数(%s)の引数に誤りがある"},
     {126, "実引数の数が仮引数の数と一致していない"},
     {127, "実引数(%s)と仮引数が同形でない"},
     {129, "代入文の左辺に対して右辺が代入可能でない"},
     {130, "in演算子の右辺の式が集合型でない"},
     {131, "ポインタは'='または'<>'の判定しか許されない"},
     {132, "集合には'>'または'<'の判定は許されない"},
     {133, "ファイルの比較は許されていない"},
     {134, "演算対象の型に誤りがある"},
     {135, "%sの演算対象の型は論理型でなければならない"},
     {136, "集合の要素記述が順序式でない"},
     {137, "集合の要素記述の型が一致していない"},
     {138, "変数の型は配列でない"},
     {139, "添字の型が宣言と一致していない"},
     {140, "変数の型がレコード型でない"},
     {141, "変数の型がファイル型､ポインタ型でない"},
     {142, "仮変数引数と実引数の型が一致していない"},
     {143, "関係演算子の被演算子の型が正しくない"},
     {144, "%sが順序式でない"},
     {145, "for文の制御変数と%sの型が適合しない"},
     {146, "%sの式が論理式でない"},
     {147, "case文の選択式の型と定数の型が一致しない"},
     {148, "添字の定数が添字型の範囲内でない"},
     {150, "標準関数(%s)への代入は許されていない"},
     {151, "関数引数への代入は許されていない"},
     {152, "レコードにこのような欄(%s)はない"},
     {155, "仮値引数に対して実引数が代入可能でない"},
     {156, "case文の定数が再度定義された"},
     {159, "実数型､文字列型の定数は指定できない"},
     {160, "手続き/関数(%s)はすでに宣言されている"},
     {161, "手続き/関数(%s)が再び前方宣言された"},
     {162, "該当する可変要素選択子がない"},
     {164, "ラベルが0から9999の間の整数でない"},
     {165, "ラベル(%s)が再度定義された"},
     {166, "ラベル(%s)が再度宣言された"},
     {167, "ラベル(%s)が宣言されていない"},
     {168, "ラベル(%s)が定義されていない"},
     {173, "実関数引数(%s)と仮関数引数の結果の型が異なっている"},
     {174, "標準手続き(%s)は実手続き引数として使えない"},
     {175, "標準関数(%s)は実関数引数として使えない"},
     {176, "関数名(%s)への代入を行っていない"},
     {177, "この場所では関数名(%s)への代入は許されない"},
     {178, "可変要素の定数に同じものが現れた"},
     {179, "タグ型の取り得るすべての値が選択要素の定数に指定されていない"},
     {186, "for文の制御変数(%s)がfor文と同一ブロックで定義されていない"},
     {187, "for文の制御変数に変数引数(%s)は使えない"},
     {188, "for文の制御変数(%s)の型が順序型でない"},
     {196, "プログラム引数に同じ名前(%s)が指定された"},
     {197, "プログラム引数に指定した名前(%s)が宣言されていない"},
     {201, "符号なし実数の表記に誤りがある"},
     {202, "文字列定数は行を越えてはいけない"},
     {203, "符号なし整数は%s以下でなければならない"},
     {205, "長さ0の文字列は許されない"},
     {207, "HAPPyでは符号なし数の表記は%s文字以内でなければならない"},
     {208, "HAPPyで扱えない大きな符号なし実数が現れた"},
     {300, "この形の%sを使うためにはプログラム引数にinputの指定が必要である"},
     {301, "この形の%sを使うためにはプログラム引数にoutputの指定が必要である"},
     {600, "HAPPyのinput,output以外の外部ファイル数制限(%s)を越えた"},
     {601, "HAPPyのcase文の選択肢定数範囲制限(%s)を越えた"},
     {602, "HAPPyの文字列の長さ制限(%s)を越えた"},
     {603, "HAPPyの名前の入れ子数制限(%s)を越えた"},
     {604, "HAPPyの手続き・関数の入れ子数制限(%s)を越えた"},
     {605, "HAPPyの型の大きさ制限(%s)を越えた"},
     {606, "HAPPyでは集合の基底型の順序数範囲に制約がある(0〜%s)"},
     {607, "HAPPyの集合構成子要素記述の値制約(0〜%s)を越えている"},
     {608, "HAPPyでは局所ファイルを許していない"},
     {609, "変数割当する記憶域を使い果たした"},
     {610, "プログラムが終わらないままEOFを検出した"},
     {700, "作業エリアが確保できなかった。コンパイルを停止する"},
     {701, "P-codeソースの出力でエラーが発生した。コンパイルを停止する"}
     }  ;

/***************************************/
/* pcerr(): エラーメッセージ出力処理   */
/***************************************/
void pcerr(int errno,char *umecomi)
{
  char buf[128];            /* エラーメッセージの埋め込みを行うワーク */
  int i = -1 ;

     errorcount++  ;                    /* エラー数カウントアップ     */
     while(errtb[++i].msgno != errno) ; /* search message             */

     sprintf(buf, errtb[i].errmsg, umecomi);  /* 埋め込みを行う       */
     printf("%s(%d) : E%03d: %s\n",
	     passname,lineno, errtb[i].msgno, buf);
}

/*******************************************/
/* inttochar(): 数字から文字列への変換処理 */
/*                数字の埋め込みに使用する */
/*******************************************/
char *inttoch(long number)
{
  static  char buf[12] ;

     sprintf(buf,"%ld",number);
     return(buf);
}
