home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Kyūkyoku!! X68000 Emulator
/
X68000Book.dat
/
mac
/
OLS
/
X68000
/
Ko-Window
/
kow142s.lzh
/
wsrv
/
resource.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-12-24
|
7KB
|
361 lines
/*
1993/ 8/ 3 H.Ogasawara(COR.)
1995/11/11 microstrlib é╓ÅCÉ│
1995/11/12 é│éτé╔æσò¥ò╧ìX
*/
#include <stdio.h>
#include <sys_doslib.h>
#include <microstr.h>
#include "clip.h"
#include "sheet.h"
#include "window.h"
#include "manager.h"
#include "readrc.h"
#include "error.h"
#define NAME_LEN 15
/* wsrv.x é┼Ägùpé╖éΘâèâ\ü[âX */
Sheet *CloseButton;
Sheet *PushButton;
Sheet *ZoomButton;
Sheet *ResizeButton;
Sheet *IconButton;
Sheet *UpArrow;
Sheet *DownArrow;
Sheet *LeftArrow;
Sheet *RightArrow;
Sheet *ErrorBomb;
Sheet *BackPattern;
static Sheet **Sheets[]= {
&CloseButton,
&PushButton,
&ZoomButton,
&ResizeButton,
&IconButton,
&UpArrow,
&DownArrow,
&LeftArrow,
&RightArrow,
&ErrorBomb,
&BackPattern,
};
static unsigned char *SheetNames[]= {
"CloseButton",
"PushButton",
"ZoomButton",
"ResizeButton",
"IconButton",
"UpArrow",
"DownArrow",
"LeftArrow",
"RightArrow",
"ErrorBomb",
"BackPattern",
NULL
};
typedef struct _Resource {
struct _Resource *next;
unsigned char name[NAME_LEN+1];
unsigned char app[NAME_LEN+1];
void *object;
} Resource;
static Resource *PatternTop;
static Resource *StringTop;
static int InitFlag= FALSE;
static unsigned char *GetWord();
static void rs_error();
static unsigned char *PatternGet();
static unsigned char *StringGet();
static unsigned char *NameGet();
/* âèâ\ü[âXé╠èmò█ */
void *
GetResource( resource, name, app )
unsigned char *resource, *name, *app;
{
Resource *p, *top;
if( *resource == 'P' ) /* Pattern */
top= PatternTop;
else if( *resource == 'S' ) /* String */
top= StringTop;
else
return NULL;
for( p= top ; p ; p= p->next ){
if( !n_strcmp( p->name, name ) && !n_strcmp( p->app, app ) )
return p->object;
}
for( p= top ; p ; p= p->next ){
if( !n_strcmp( p->name, name ) && p->app[0] == '\0' )
return p->object;
}
return NULL;
}
/* âèâ\ü[âXâtâ@âCâïé╠ô╟é▌ì₧é▌ */
void
ReadResource()
{
int i;
unsigned char *xbuf, buf[256], *ptr;
Resource *p;
int fn;
if( (fn= OpenRC( 's' )) < 0 ){
if( InitFlag ){
ErrorSelect( "wsrv.rsé¬î⌐é┬é⌐éΦé▄é╣é±", "", 0, 0 );
ServerQuit();
}else{
errput( "wsrv.rsé¬î⌐é┬é⌐éΦé▄é╣é±" ); /* 1991 COR. */
errput( "\n" );
EXIT2( 1 );
}
}
if( InitFlag ){
for( p= PatternTop ; p ; p= p->next ){
WindowMemoryFree( ((Sheet*)p->object)->buf1 );
WindowMemoryFree( p );
}
for( p= StringTop ; p ; p= p->next ){
WindowMemoryFree( p->object );
WindowMemoryFree( p );
}
}
{
int len= SEEK( fn, 0, 2 );
xbuf= (void*)MALLOC( len+2 );
SEEK( fn, 0, 0 );
READ( fn, xbuf, len );
CLOSE( fn );
xbuf[len]= '\0';
}
PatternTop= NULL;
StringTop= NULL;
for( ptr= xbuf ; ptr= GetWord( buf, ptr ) ;){
if( !n_strcmp( buf, "Pattern" ) ){
ptr= PatternGet( ptr );
}else if( !n_strcmp( buf, "String" ) ){
ptr= StringGet( ptr );
}
}
MFREE( xbuf );
for( i= 0 ; SheetNames[i] ; i++ ){
if(!(*(Sheets[i])= GetResource( "P", SheetNames[i], "Wsrv" ))){
if( InitFlag ){
ErrorSelect("âèâ\ü[âXé¬æ╢ì▌é╡é▄é╣é±", "",0,0);
ServerQuit();
}else{
errput( "âèâ\ü[âX " );
errput( SheetNames[i] );
errput( " é¬æ╢ì▌é╡é▄é╣é±\n" );
EXIT2( 1 );
}
}
}
InitFlag= TRUE;
}
static unsigned char *
GetWord( str, ptr )
unsigned char *str, *ptr;
{
unsigned char c= 0;
int kanji= 0;
ptr= SkipSpace( ptr );
if( *ptr == '/' && ptr[1] == '*' ){
for( ptr+= 2 ; *ptr ; ptr++ ){
if( *ptr == '*' && ptr[1] == '/' ){
ptr+= 2;
break;
}
}
}
if( !*ptr ){
*str= '\0';
return NULL;
}
if( *ptr == '\"' )
c= *ptr++;
for(; *ptr && *ptr != c && (c || *ptr > ' ') ;){
if( kanji ){
kanji= 0;
}else if( iskanji( *ptr ) ){
kanji= 1;
}else if( *ptr == '\\' ){
switch( *++ptr|0x20 ){
case 'n':
*str++= '\n';
break;
case 't':
*str++= '\t';
break;
case 'x': {
unsigned char n= 0;
for( ptr++; *ptr>='0' && *ptr<='f' ; ptr++ ){
n<<= 4;
n+= (*ptr>'9' ? *ptr-7 : *ptr) & 15;
}
*str++= n;
continue;
}
default:
if( *ptr >= '0' && *ptr <= '7' ){
unsigned char n= 0;
for( ptr++ ; *ptr>='0' && *ptr<='7' ;){
n<<= 3;
n+= *ptr++ & 7;
}
*str++= n;
}else if( *ptr )
*str++= *ptr++;
continue;
}
ptr++;
continue;
}
*str++= *ptr++;
}
if( c && *ptr == c )
ptr++;
*str= '\0';
return ptr;
}
unsigned char *
SkipSpace( ptr )
unsigned char *ptr;
{
for(; *ptr && *ptr <= ' ' ; ptr++ );
return ptr;
}
static unsigned char *
PatternGet( ptr )
unsigned char *ptr;
{
int i;
Resource *p;
Sheet *sp;
unsigned short *sptr;
unsigned char buf[256];
p= WindowMemoryAlloc( sizeof(Resource) + sizeof(Sheet) );
sp= (Sheet*)( (void*)p + sizeof( Resource ) );
p->object= sp;
p->next= PatternTop;
PatternTop= p;
ptr= NameGet( p, ptr );
ptr= GetWord( buf, ptr );
sp->h= _atoiX( buf );
ptr= GetWord( buf, ptr );
sp->v= _atoiX( buf );
sp->hword= ((sp->h-1)>>4) +1;
sp->buf1= WindowMemoryAlloc( sp->hword*sp->v * sizeof(short) * 2 );
sp->buf2= sp->buf1+ sp->hword*sp->v;
for( sptr= sp->buf1, i= 0 ; i < 2 ; i++ ){
ptr= GetWord( buf, ptr );
if( *buf != '{' )
rs_error( p->name );
for(;;){
ptr= GetWord( buf, ptr );
if( *buf == '}' )
break;
*sptr++= atoh( buf );
}
sptr= sp->buf2;
}
ptr= GetWord( buf, ptr );
if( *buf != '}' )
rs_error( p->name );
return ptr;
}
static unsigned char *
StringGet( ptr )
unsigned char *ptr;
{
Resource *p;
unsigned char buf[1024], *sptr;
p= WindowMemoryAlloc( sizeof(Resource) );
p->next= StringTop;
StringTop= p;
ptr= NameGet( p, ptr );
for( sptr= buf ;;){
ptr= GetWord( sptr, ptr );
if( *sptr == '}' )
break;
for(; *sptr ; sptr++ );
}
*sptr= '\0';
p->object= WindowMemoryAlloc( sptr-buf+1 );
s_strcpy( p->object, buf );
return ptr;
}
static unsigned char *
NameGet( p, ptr )
Resource *p;
unsigned char *ptr;
{
unsigned char buf[128];
ptr= GetWord( p->name, ptr );
ptr= GetWord( p->app, ptr );
if( *p->app == '{' )
*p->app= '\0';
else
ptr= GetWord( buf, ptr );
return ptr;
}
atoh( ptr )
unsigned char *ptr;
{
unsigned int n= 0;
for(; *ptr>='0' && *ptr<='f' ; ptr++ ){
n<<= 4;
n+= (*ptr>'9' ? *ptr-7 : *ptr) & 15;
}
return n;
}
static void
rs_error( name )
unsigned char *name;
{
unsigned char buf[80];
s_strcpy(
s_strcpy( s_strcpy( buf, "âèâ\ü[âXâtâ@âCâïé╠ïLÅqé╔îδéΦé¬éáéΦé▄é╖( " ),
name ), " )\n" );
if( InitFlag ){
ErrorSelect( buf, "", 0, 0 );
ServerQuit();
}else{
errput( buf );
EXIT2( 1 );
}
}
/* :vi:se ts=8 sw=8: */