C:\home\SVGCats_src\src\linecnt.c
1|/************************************************************************** 2|* 1. <<< BLex3 対応・行数カウンタ (LineCnt) >>> 3|***************************************************************************/ 4| 5|#include <LineCnt.ah> /* Auto include header, Look at mixer-... folder */ 6| 7| 8| 9|/*---------------------------------------------------------------------*/ 10|/* 2. <<<◆(LineCnt) BLex3 対応・行数カウンタ >>> */ 11|/*---------------------------------------------------------------------*/ 12| 13|void LineCnt_parse_sub( LineCnt*, char* beforeFp, char* afterFp ); 14| 15|/************************************************************************** 16|* 3. <<< [LineCnt_init] 初期化する >>> 17|*【引数】 18|* ・LineCnt* m; BLex3 対応・行数カウンタ 19|***************************************************************************/ 20|void LineCnt_init( LineCnt* m ) 21|{ 22| ERRORS_INITCHK( m, 0 ); 23| 24| m->iLine = 1; 25| m->iColumn = 1; 26| BLex3_Pos_init( &m->prevPos ); 27|} 28| 29| 30| 31|/************************************************************************** 32|* 4. <<< [LineCnt_print] デバッグ表示する >>> 33|***************************************************************************/ 34|#ifndef ERRORS_CUT_DEBUG_TOOL 35|void LineCnt_print( LineCnt* m, const char* title ) 36|{ 37| Errors_printf( "%sLineCnt[%p] eng=[%p] iLine=%d, iColumn=%d, prevPos=%d", 38| title, m, m->eng, m->iLine, m->iColumn, m->prevPos ); 39|} 40|#endif 41| 42| 43| 44|/************************************************************************** 45|* 5. <<< [LineCnt_linkEngine] 字句解析エンジンと関連付ける >>> 46|*【引数】 47|* ・LineCnt* m; BLex3 対応・行数カウンタ 48|* ・BLex3_Engine* eng; 字句解析エンジン 49|***************************************************************************/ 50|void LineCnt_linkEngine( LineCnt* m, BLex3_Engine* eng ) 51|{ 52| ERRORS_INITCHK( m, 1 ); 53| 54| m->eng = eng; 55|} 56| 57| 58| 59|/************************************************************************** 60|* 6. <<< [LineCnt_parse] 行番号を解析する >>> 61|*【引数】 62|* ・LineCnt* m; BLex3 対応・行数カウンタ 63|*【補足】 64|*・行番号データを現在位置に合わせます。 65|***************************************************************************/ 66|void LineCnt_parse( LineCnt* m ) 67|{ 68| BLex3_Pos now; 69| BLex3_Pos pos; 70| char* fp; 71| char* fp_over; 72| 73| ERRORS_INITCHK( m, 1 ); 74| 75| BLex3_Engine_getPos( m->eng, &now ); 76| BLex3_Engine_setPos( m->eng, &m->prevPos ); 77| 78| for (;;) { 79| fp = BLex3_Engine_getFilePtr( m->eng, 0 ); 80| if ( fp == NULL ) return; 81| fp_over = BLex3_Engine_getOverPtr( m->eng ); 82| BLex3_Engine_getPos2( m->eng, fp_over, &pos ); 83| if ( now.pos <= pos.pos ) 84| break; 85| LineCnt_parse_sub( m, fp, fp_over ); 86| BLex3_Engine_nextBuf( m->eng ); 87| } 88| LineCnt_parse_sub( m, fp, 89| BLex3_Engine_getFilePtrByPos( m->eng, now.pos ) ); 90| 91| #if ERRORS_DEBUG_FALSE 92| Errors_printf( "line(%d,%d) pos 0x%lX .. 0x%lX", 93| m->iLine, m->iColumn, now.pos, m->prevPos.pos ); 94| #endif 95| 96| m->prevPos = now; 97|} 98| 99| 100| 101|/************************************************************************** 102|* 7. <<< [LineCnt_parse_sub] 行番号を解析するサブルーチン >>> 103|*【引数】 104|* ・LineCnt* m; BLex3 対応・行数カウンタ 105|* ・char* before; これまで解析したファイルポインタの位置 106|* ・char* after; 解析後のファイルポインタの位置 107|*【補足】 108|*・内部用です。 109|***************************************************************************/ 110|void LineCnt_parse_sub( LineCnt* m, char* beforeFp, char* afterFp ) 111|{ 112| char* fp; 113| int iLine = m->iLine; 114| int iColumn = m->iColumn; 115| 116| for ( fp = beforeFp; fp < afterFp; fp++ ) { 117| if ( *fp == '\n' ) { 118| iLine ++; iColumn = 1; 119| } 120| else 121| iColumn ++; 122| } 123| m->iLine = iLine; 124| m->iColumn = iColumn; 125|} 126| 127|/************************************************************************** 128|* 8. <<< [LineCnt_getTokenType] トークンタイプを返す >>> 129|*【引数】 130|* ・LineCnt* m; BLex3 対応・行数カウンタ 131|***************************************************************************/ 132|int LineCnt_getTokenType( LineCnt* m ) 133|{ 134| return BLex3_OutOfToken; 135|} 136| 137|/************************************************************************** 138|* 9. <<< [LineCnt_getNextParsePos] 次に字句解析する位置を取得する >>> 139|*【引数】 140|* ・LineCnt* m; BLex3 対応・行数カウンタ 141|***************************************************************************/ 142|void LineCnt_getNextParsePos( LineCnt* m, BLex3_Pos* pos ) 143|{ 144| pos->pos = BLex3_PosForNoEvent; 145| pos->sjis_type = BLex3_SJisUnknown; 146|} 147| 148|/************************************************************************** 149|* 10. <<< [LineCnt_printLastMsg] 処理後のメッセージを表示する >>> 150|*【引数】 151|* ・LineCnt* m; BLex3 対応・行数カウンタ 152|***************************************************************************/ 153|void LineCnt_printLastMsg( LineCnt* m, FILE* f, const char* title ) 154|{ 155| ERRORS_INITCHK( m, 1 ); 156| 157| fprintf( f, "%sline count = %d\r\n", title, m->iLine ); 158|} 159| 160| 161| 162|