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 >
C/C++ Source or Header  |  1995-12-24  |  7KB  |  361 lines

  1. /*
  2.     1993/ 8/ 3 H.Ogasawara(COR.)
  3.     1995/11/11 microstrlib é╓ÅCÉ│
  4.     1995/11/12 é│éτé╔æσò¥ò╧ìX
  5. */
  6. #include    <stdio.h>
  7. #include    <sys_doslib.h>
  8. #include    <microstr.h>
  9.  
  10. #include    "clip.h"
  11. #include    "sheet.h"
  12. #include    "window.h"
  13. #include    "manager.h"
  14. #include    "readrc.h"
  15. #include    "error.h"
  16.  
  17. #define        NAME_LEN    15
  18.  
  19. /*  wsrv.x é┼Ägùpé╖éΘâèâ\ü[âX  */
  20. Sheet    *CloseButton;
  21. Sheet    *PushButton;
  22. Sheet    *ZoomButton;
  23. Sheet    *ResizeButton;
  24. Sheet    *IconButton;
  25. Sheet    *UpArrow;
  26. Sheet    *DownArrow;
  27. Sheet    *LeftArrow;
  28. Sheet    *RightArrow;
  29. Sheet    *ErrorBomb;
  30. Sheet    *BackPattern;
  31. static Sheet    **Sheets[]= {
  32.         &CloseButton,
  33.         &PushButton,
  34.         &ZoomButton,
  35.         &ResizeButton,
  36.         &IconButton,
  37.         &UpArrow,
  38.         &DownArrow,
  39.         &LeftArrow,
  40.         &RightArrow,
  41.         &ErrorBomb,
  42.         &BackPattern,
  43.     };
  44. static unsigned char    *SheetNames[]= {
  45.         "CloseButton",
  46.         "PushButton",
  47.         "ZoomButton",
  48.         "ResizeButton",
  49.         "IconButton",
  50.         "UpArrow",
  51.         "DownArrow",
  52.         "LeftArrow",
  53.         "RightArrow",
  54.         "ErrorBomb",
  55.         "BackPattern",
  56.         NULL
  57.     };
  58.  
  59.  
  60. typedef    struct _Resource {
  61.     struct _Resource    *next;
  62.     unsigned char        name[NAME_LEN+1];
  63.     unsigned char        app[NAME_LEN+1];
  64.     void            *object;
  65. } Resource;
  66.  
  67. static    Resource    *PatternTop;
  68. static    Resource    *StringTop;
  69. static    int        InitFlag= FALSE;
  70.  
  71. static unsigned char    *GetWord();
  72. static void        rs_error();
  73. static unsigned char     *PatternGet();
  74. static unsigned char    *StringGet();
  75. static unsigned char    *NameGet();
  76.  
  77. /* âèâ\ü[âXé╠èmò█ */
  78. void *
  79. GetResource( resource, name, app )
  80. unsigned char    *resource, *name, *app;
  81. {
  82.     Resource    *p, *top;
  83.  
  84.     if( *resource == 'P' )        /* Pattern */
  85.         top= PatternTop;
  86.     else if( *resource == 'S' )    /* String */
  87.         top= StringTop;
  88.     else
  89.         return    NULL;
  90.  
  91.     for( p= top ; p ; p= p->next ){
  92.         if( !n_strcmp( p->name, name ) && !n_strcmp( p->app, app ) )
  93.             return    p->object;
  94.     }
  95.     for( p= top ; p ; p= p->next ){
  96.         if( !n_strcmp( p->name, name ) && p->app[0] == '\0' )
  97.             return    p->object;
  98.     }
  99.     return    NULL;
  100. }
  101.  
  102. /* âèâ\ü[âXâtâ@âCâïé╠ô╟é▌ì₧é▌ */
  103. void
  104. ReadResource()
  105. {
  106.     int        i;
  107.     unsigned char    *xbuf, buf[256], *ptr;
  108.     Resource    *p;
  109.     int        fn;
  110.  
  111.     if( (fn= OpenRC( 's' )) < 0 ){
  112.         if( InitFlag ){
  113.             ErrorSelect( "wsrv.rsé¬î⌐é┬é⌐éΦé▄é╣é±", "", 0, 0 );
  114.             ServerQuit();
  115.         }else{
  116.             errput( "wsrv.rsé¬î⌐é┬é⌐éΦé▄é╣é±" );    /* 1991 COR. */
  117.             errput( "\n" );
  118.             EXIT2( 1 );
  119.         }
  120.     }
  121.     if( InitFlag ){
  122.         for( p= PatternTop ; p ; p= p->next ){
  123.             WindowMemoryFree( ((Sheet*)p->object)->buf1 );
  124.             WindowMemoryFree( p );
  125.         }
  126.         for( p= StringTop ; p ; p= p->next ){
  127.             WindowMemoryFree( p->object );
  128.             WindowMemoryFree( p );
  129.         }
  130.     }
  131.     {
  132.         int    len= SEEK( fn, 0, 2 );
  133.         xbuf= (void*)MALLOC( len+2 );
  134.         SEEK( fn, 0, 0 );
  135.         READ( fn, xbuf, len );
  136.         CLOSE( fn );
  137.         xbuf[len]= '\0';
  138.     }
  139.  
  140.     PatternTop= NULL;
  141.     StringTop= NULL;
  142.     for( ptr= xbuf ; ptr= GetWord( buf, ptr ) ;){
  143.         if( !n_strcmp( buf, "Pattern" ) ){
  144.             ptr= PatternGet( ptr );
  145.         }else if( !n_strcmp( buf, "String" ) ){
  146.             ptr= StringGet( ptr );
  147.         }
  148.     }
  149.     MFREE( xbuf );
  150.  
  151.     for( i= 0 ; SheetNames[i] ; i++ ){
  152.         if(!(*(Sheets[i])= GetResource( "P", SheetNames[i], "Wsrv" ))){
  153.             if( InitFlag ){
  154.                 ErrorSelect("âèâ\ü[âXé¬æ╢ì▌é╡é▄é╣é±", "",0,0);
  155.                 ServerQuit();
  156.             }else{
  157.                 errput( "âèâ\ü[âX " );
  158.                 errput( SheetNames[i] );
  159.                 errput( " é¬æ╢ì▌é╡é▄é╣é±\n" );
  160.                 EXIT2( 1 );
  161.             }
  162.         }
  163.     }
  164.     InitFlag= TRUE;
  165. }
  166.  
  167. static unsigned char *
  168. GetWord( str, ptr )
  169. unsigned char    *str, *ptr;
  170. {
  171.     unsigned char    c= 0;
  172.     int        kanji= 0;
  173.  
  174.     ptr= SkipSpace( ptr );
  175.  
  176.     if( *ptr == '/' && ptr[1] == '*' ){
  177.         for( ptr+= 2 ; *ptr ; ptr++ ){
  178.             if( *ptr == '*' && ptr[1] == '/' ){
  179.                 ptr+= 2;
  180.                 break;
  181.             }
  182.         }
  183.     }
  184.     if( !*ptr ){
  185.         *str= '\0';
  186.         return    NULL;
  187.     }
  188.  
  189.     if( *ptr == '\"' )
  190.         c= *ptr++;
  191.     for(; *ptr && *ptr != c && (c || *ptr > ' ') ;){
  192.         if( kanji ){
  193.             kanji= 0;
  194.         }else if( iskanji( *ptr ) ){
  195.             kanji= 1;
  196.         }else if( *ptr == '\\' ){
  197.             switch( *++ptr|0x20 ){
  198.             case 'n':
  199.                 *str++= '\n';
  200.                 break;
  201.             case 't':
  202.                 *str++= '\t';
  203.                 break;
  204.             case 'x': {
  205.                 unsigned char    n= 0;
  206.                 for( ptr++; *ptr>='0' && *ptr<='f' ; ptr++ ){
  207.                     n<<= 4;
  208.                     n+= (*ptr>'9' ? *ptr-7 : *ptr) & 15;
  209.                 }
  210.                 *str++= n;
  211.                 continue;
  212.                 }
  213.             default:
  214.                 if( *ptr >= '0' && *ptr <= '7' ){
  215.                     unsigned char    n= 0;
  216.                     for( ptr++ ; *ptr>='0' && *ptr<='7' ;){
  217.                         n<<= 3;
  218.                         n+= *ptr++ & 7;
  219.                     }
  220.                     *str++= n;
  221.                 }else if( *ptr )
  222.                     *str++= *ptr++;
  223.                 continue;
  224.             }
  225.             ptr++;
  226.             continue;
  227.         }
  228.         *str++= *ptr++;
  229.     }
  230.     if( c && *ptr == c )
  231.         ptr++;
  232.     *str= '\0';
  233.     return    ptr;
  234. }
  235.  
  236. unsigned char *
  237. SkipSpace( ptr )
  238. unsigned char    *ptr;
  239. {
  240.     for(; *ptr && *ptr <= ' ' ; ptr++ );
  241.     return    ptr;
  242. }
  243.  
  244. static unsigned char *
  245. PatternGet( ptr )
  246. unsigned char    *ptr;
  247. {
  248.     int        i;
  249.     Resource    *p;
  250.     Sheet        *sp;
  251.     unsigned short    *sptr;
  252.     unsigned char    buf[256];
  253.  
  254.     p= WindowMemoryAlloc( sizeof(Resource) + sizeof(Sheet) );
  255.     sp= (Sheet*)( (void*)p + sizeof( Resource ) );
  256.     p->object= sp;
  257.     p->next= PatternTop;
  258.     PatternTop= p;
  259.  
  260.     ptr= NameGet( p, ptr );
  261.  
  262.     ptr= GetWord( buf, ptr );
  263.     sp->h= _atoiX( buf );
  264.     ptr= GetWord( buf, ptr );
  265.     sp->v= _atoiX( buf );
  266.     sp->hword= ((sp->h-1)>>4) +1;
  267.  
  268.     sp->buf1= WindowMemoryAlloc( sp->hword*sp->v * sizeof(short) * 2 );
  269.     sp->buf2= sp->buf1+ sp->hword*sp->v;
  270.  
  271.     for( sptr= sp->buf1, i= 0 ; i < 2 ; i++ ){
  272.         ptr= GetWord( buf, ptr );
  273.         if( *buf != '{' )
  274.             rs_error( p->name );
  275.         for(;;){
  276.             ptr= GetWord( buf, ptr );
  277.             if( *buf == '}' )
  278.                 break;
  279.             *sptr++= atoh( buf );
  280.         }
  281.         sptr= sp->buf2;
  282.     }
  283.     ptr= GetWord( buf, ptr );
  284.     if( *buf != '}' )
  285.         rs_error( p->name );
  286.     return    ptr;
  287. }
  288.  
  289. static unsigned char *
  290. StringGet( ptr )
  291. unsigned char    *ptr;
  292. {
  293.     Resource    *p;
  294.     unsigned char    buf[1024], *sptr;
  295.  
  296.     p= WindowMemoryAlloc( sizeof(Resource) );
  297.     p->next= StringTop;
  298.     StringTop= p;
  299.  
  300.     ptr= NameGet( p, ptr );
  301.  
  302.     for( sptr= buf ;;){
  303.         ptr= GetWord( sptr, ptr );
  304.         if( *sptr == '}' )
  305.             break;
  306.         for(; *sptr ; sptr++ );
  307.     }
  308.     *sptr= '\0';
  309.  
  310.     p->object= WindowMemoryAlloc( sptr-buf+1 );
  311.     s_strcpy( p->object, buf );
  312.     return    ptr;
  313. }
  314.  
  315.  
  316. static unsigned char *
  317. NameGet( p, ptr )
  318. Resource    *p;
  319. unsigned char    *ptr;
  320. {
  321.     unsigned char    buf[128];
  322.     ptr= GetWord( p->name, ptr );
  323.     ptr= GetWord( p->app, ptr );
  324.     if( *p->app == '{' )
  325.         *p->app= '\0';
  326.     else
  327.         ptr= GetWord( buf, ptr );
  328.     return    ptr;
  329. }
  330.  
  331. atoh( ptr )
  332. unsigned char    *ptr;
  333. {
  334.     unsigned int    n= 0;
  335.     for(; *ptr>='0' && *ptr<='f' ; ptr++ ){
  336.         n<<= 4;
  337.         n+= (*ptr>'9' ? *ptr-7 : *ptr) & 15;
  338.     }
  339.     return    n;
  340. }
  341.  
  342. static void
  343. rs_error( name )
  344. unsigned char    *name;
  345. {
  346.     unsigned char    buf[80];
  347.  
  348.     s_strcpy(
  349.     s_strcpy( s_strcpy( buf, "âèâ\ü[âXâtâ@âCâïé╠ïLÅqé╔îδéΦé¬éáéΦé▄é╖( " ),
  350.         name ), " )\n" );
  351.     if( InitFlag ){
  352.         ErrorSelect( buf, "", 0, 0 );
  353.         ServerQuit();
  354.     }else{
  355.         errput( buf );
  356.         EXIT2( 1 );
  357.     }
  358. }
  359.  
  360. /* :vi:se ts=8 sw=8: */
  361.