tixparse.c
来自「开放源码的编译器open watcom 1.6.0版的源代码」· C语言 代码 · 共 560 行 · 第 1/2 页
C
560 行
/****************************************************************************
*
* Open Watcom Project
*
* Portions Copyright (c) 1983-2002 Sybase, Inc. All Rights Reserved.
*
* ========================================================================
*
* This file contains Original Code and/or Modifications of Original
* Code as defined in and that are subject to the Sybase Open Watcom
* Public License version 1.0 (the 'License'). You may not use this file
* except in compliance with the License. BY USING THIS FILE YOU AGREE TO
* ALL TERMS AND CONDITIONS OF THE LICENSE. A copy of the License is
* provided with the Original Code and Modifications, and is also
* available at www.sybase.com/developer/opensource.
*
* The Original Code and all software distributed under the License are
* distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
* EXPRESS OR IMPLIED, AND SYBASE AND ALL CONTRIBUTORS HEREBY DISCLAIM
* ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR
* NON-INFRINGEMENT. Please see the License for the specific language
* governing rights and limitations under the License.
*
* ========================================================================
*
* Description: Parse the .tix terminal description file.
*
****************************************************************************/
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#if defined(__WATCOMC__)
#include <sys/ioctl.h>
#elif !defined( HP )
#include <termios.h>
#else
#include <stdarg.h>
#endif
#if defined(__SUNPRO_CC) || defined(__SUNPRO_C)
// curses.h when using SUNPRO compiler has its own typedef for bool
#define bool curses_bool
#include <curses.h>
#include <term.h>
#undef bool
#else
#include <curses.h>
#include <term.h>
#endif
#include <unistd.h>
#include "stdui.h"
#include "qnxuiext.h"
#include "tixparse.h"
#include "trie.h"
#ifndef __WATCOMC__
#include "clibext.h"
#endif
#if 0
#include "stdtypes.h"
#include "unixmisc.h"
#include "wlangfmt.h"
#endif
extern char ui_tix_path[];
extern int ui_tix_missing( const char *name );
typedef enum {
TT_CODE,
TT_STRING,
TT_EOF
} tix_token;
static FILE *in_file= NULL;
char ti_char_map[256][4];
unsigned char _ti_alt_map[32];
void tix_error( char *str )
/*************************/
{
static char header[]= "\nError in ";
extern char *UITermType;
#define uiwrite( s ) write( UIConHandle, s, strlen( s ) );
write( UIConHandle, header, sizeof( header )-1 );
uiwrite( UITermType );
uiwrite( ": " );
uiwrite( str );
uiwrite( "\n" );
}
FILE *ti_fopen( char *fnam )
/**************************/
{
FILE *res;
char *homeDir;
char fpath[_MAX_PATH+1];
if( fnam==NULL || fnam[0]=='\0' ) {
return( NULL );
}
// first look in current directory
res = fopen( fnam, "r" );
if( res != NULL ) {
return( res );
}
// if it's not there, look in the user's home directory
homeDir = getenv( "HOME" );
if( homeDir != NULL && homeDir[0] != '\0' ) {
strcpy( fpath, homeDir );
strcat( fpath, "/" );
strcat( fpath, fnam );
res = fopen( fpath, "r" );
if( res != NULL ) {
return( res );
}
}
#if 0
if( LS_QualifySqlAnyFile( fnam, fpath, sizeof(fpath) ) ) {
res = fopen( fpath, "r" );
if( res != NULL ) {
return( res );
}
}
#endif
// finally, look in /usr/watcom/tix/<name>
// strcpy( fpath, TIX_PATH_NAME );
strcpy( fpath, ui_tix_path );
strcat( fpath, fnam );
res = fopen( fpath, "r" );
return( res );
}
int init_tix_scanner( char *name )
/********************************/
{
char tix_name[19];
if( name ) {
if( *name ) {
strcpy( tix_name, name );
strcat( tix_name, ".tix" );
in_file = ti_fopen( tix_name );
if( in_file != NULL ) return( 1 );
}
if( strstr( name, "qnx" ) != 0 ) {
in_file = ti_fopen( "qnx.tix" );
if( in_file != NULL ) return( 1 );
} else if( strstr( name, "ansi" ) != 0 ) {
in_file = ti_fopen( "ansi.tix" );
if( in_file != NULL ) return( 1 );
} else if( strstr( name, "xterm" ) != 0 ) {
in_file = ti_fopen( "xterm.tix" );
if( in_file != NULL ) return( 1 );
in_file = ti_fopen( "ansi.tix" );
if( in_file != NULL ) return( 1 );
}
}
in_file = ti_fopen( "default.tix" );
return( in_file != NULL );
}
void close_tix_scanner( void )
/****************************/
{
if( in_file!=NULL ){
fclose( in_file );
}
}
static tix_token get_tix_token( char *buff )
/******************************************/
{
int c;
char *p;
char *end;
unsigned num;
char endc;
for( ;; ) {
c = getc( in_file );
if( c == EOF ) return( TT_EOF );
if( c == '#' ) {
/* eat a comment */
for( ;; ) {
c = getc( in_file );
if( c == EOF ) return( TT_EOF );
if( c == '\n' ) break;
}
}
if( !isspace( c ) ) break;
}
p = buff;
if( c == '\'' || c == '\"' ) {
/* collect a string */
endc = c;
for( ;; ) {
c = getc( in_file );
if( c == EOF ) break;
if( c == '\r' ) break;
if( c == '\n' ) break;
if( c == endc ) break;
if( c == '\\' ) {
c = getc( in_file );
if( c == EOF ) break;
switch( c ) {
case 'a':
c = '\a';
break;
case 'b':
c = '\b';
break;
case 'e':
c = '\x1b';
break;
case 'f':
c = '\f';
break;
case 'n':
c = '\n';
break;
case 'r':
c = '\r';
break;
case 't':
c = '\t';
break;
case 'v':
c = '\b';
break;
case 'x':
num = 0;
for( ;; ) {
c = getc( in_file );
if( c == EOF ) break;
if( isdigit( c ) ) {
c = c - '0';
} else if( c >= 'A' && c <= 'F' ) {
c = c - 'A' + 10;
} else if( c >= 'a' && c <= 'f' ) {
c = c - 'a' + 10;
} else {
ungetc( c, in_file );
}
num = (num << 8) + c;
}
c = num;
break;
}
}
*p++ = c;
}
*p = '\0';
return( TT_CODE );
} else {
/* collect a string or number */
for( ;; ) {
*p++ = c;
c = getc( in_file );
if( c == EOF ) break;
if( isspace( c ) ) break;
if( c == '#' ) {
ungetc( c, in_file );
break;
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?