home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 5 Edit / 05-Edit.zip / muleos2.zip / omake.zip / mixgen.c < prev    next >
C/C++ Source or Header  |  1994-02-25  |  16KB  |  625 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <stdarg.h>
  5. #include <sys/types.h>
  6. #include <sys/stat.h>
  7. #include <time.h>
  8. #include <sys/utime.h>
  9.  
  10. typedef unsigned char UCHAR ;
  11. typedef UCHAR *PUCHAR ;
  12.  
  13. typedef short SHORT ;
  14. typedef SHORT *PSHORT ;
  15.  
  16. typedef unsigned short USHORT ;
  17. typedef USHORT *PUSHORT ;
  18.  
  19. typedef struct {
  20.     char *name ;
  21.     char **value ;
  22. } CONFIGDATA ;
  23.  
  24. #define isKANJI(c) \
  25.     ((UCHAR)(c) & 0x80 && ((UCHAR)(c) < 0xA0 || (UCHAR)(c) >= 0xE0))
  26. #define BODYNAME    "body.dat"
  27. #define BUFFER_SIZE 256
  28.  
  29. char    *UupcConfDir = NULL ;    /* UUPCâRâôâtâBâOâfâBâîâNâgâèü[        */
  30. char    *UupcNewsDir = NULL ;    /* UUPCâjâàü[âXâfâBâîâNâgâèü[        */
  31.  
  32. CONFIGDATA    Conf[] = {
  33.     { "confdir",    &UupcConfDir        } ,
  34.     { "newsdir",    &UupcNewsDir        } ,
  35.     { NULL, NULL }
  36. } ;
  37.  
  38. char    NowLogGenData[256] ;
  39. FILE    *in, *out, *msgbody ;
  40.  
  41. UCHAR    buf[2048] ;        /* âüâbâZü[âWôⁿù═âoâbâtâ@        */
  42. UCHAR    wbuf[256] ;        /* ö─ùpâoâbâtâ@                */
  43.  
  44. UCHAR    dir[256] ;        /* âüâbâZü[âWâOâïü[âvû╝            */
  45. long    number ;        /* âüâbâZü[âWö╘ìå            */
  46. UCHAR    name[256] ;        /* ö¡ÉMÄ╥û╝                */
  47. long    MsgSize ;        /* âüâbâZü[âWò╢ÄÜÉö            */
  48. UCHAR    youbi[8] ;        /* ö¡ÉMùjô·                */
  49. UCHAR    tuki[8] ;        /* ö¡ÉMîÄ                */
  50. int    day ;            /* ö¡ÉMô·                */
  51. UCHAR    jikan[16] ;        /* ö¡ÉMÄ₧è╘                */
  52. int    year ;            /* ö¡ÉMöN                */
  53. int    re_num ;        /* âèâvâëâCâüâbâZü[âWö╘ìå        */
  54.  
  55. UCHAR    messageid[256] ;    /* ö¡ÉMâüâbâZü[âWéhécâfü[â^        */
  56. UCHAR    subject[256] ;        /* òWæΦâfü[â^                */
  57.  
  58. UCHAR    OutDir[256] ;        /* âèâvâëâCâfü[â^ÄQÅ╞âfâBâîâNâgâèü[û╝    */
  59.  
  60. UCHAR    OutMsgBuf[512] ;    /* JISâRü[âhÅoù═âoâbâtâ@        */
  61.  
  62. long    lines ;            /* âüâbâZü[âWâëâCâôÉö            */
  63. long    endnumber ;        /* âüâbâZü[âWâOâïü[âvôαÅIù╣ö╘ìå        */
  64.  
  65. UCHAR    ActiveFile[256] ;    /* NEWSâAâNâeâBâuÄwÆΦâtâ@âCâïû╝        */
  66. int    ActiveMode ;        /* âüâbâZü[âWâtâ@âCâïò█æ╢é╠ùLû│        */
  67. int    ExecMode ;        /* âvâìâOâëâÇÄ└ìsâéü[âh            */
  68.  
  69. /* ôαòöâTâuâïü[â`âôâvâìâgâ^âCâvÉΘî╛ */
  70. void ReadHeader( void ) ;
  71. void CreateDir( char *dir ) ;
  72. void WriteHeader( void ) ;
  73. void DataWrite( const char *fmt, ... ) ;
  74. USHORT SJIStoJIS( UCHAR byte1, UCHAR byte2 ) ;
  75. void UpdateMessage( void ) ;
  76. void UpdateActive( void ) ;
  77. void CheckActive( void ) ;
  78. void GetConfigData( char *rcname ) ;
  79. void FreeUupcValue( ) ;
  80.  
  81.  
  82. /************************************************/
  83. /*                        */
  84. /*                        */
  85. /*                        */
  86. /************************************************/
  87. int main( int argc, char **argv )
  88. {
  89.     UCHAR    *tmp ;
  90.     long    now ;
  91.  
  92.     if ( strcmp( argv[1], "-c" ) == 0 ) {
  93.     ExecMode = 0 ;        /* check mode */
  94.     ++argv ;
  95.     --argc ;
  96.     } else
  97.     ExecMode = 1 ;        /* convert mode */
  98.  
  99.     if ( argc != 2 ) {
  100.     printf( "usage: %s [-c] logfile\n" ) ;
  101.     printf( "  -c Check log file format\n" ) ;
  102.     exit( 1 ) ;
  103.     }
  104.     if ( ( in = fopen( argv[1], "r" ) ) == NULL ) {
  105.     fprintf( stderr, "%s é¬æ╢ì▌é╡é▄é╣é±üB\n", argv[1] ) ;
  106.         exit( 1 ) ;
  107.     }
  108.  
  109.     /* UUPCè┬ï½ÄµéΦì₧é▌ */
  110.     GetConfigData( "UUPCSYSRC" ) ;
  111.     GetConfigData( "UUPCUSRRC" ) ;
  112.  
  113.     strcpy( ActiveFile, UupcConfDir ) ;
  114.     strcat( ActiveFile, "/active" ) ;
  115.     if ( ExecMode ) {
  116.     sprintf( wbuf, "copy %s %s.bak > nul", ActiveFile, ActiveFile ) ;
  117.     system( wbuf ) ;
  118.  
  119.     *NowLogGenData = '\0' ;
  120.  
  121.     out = fopen( "dummy", "wb" ) ;
  122.     msgbody = fopen( BODYNAME, "w" ) ;
  123.     ActiveMode = 0 ;
  124.     }
  125.     now = 0L ;
  126.  
  127.     while ( fgets( buf, 2048, in ) != NULL ) {
  128.     if ( ( tmp = strstr( buf, "==========================\n" ) ) != 0 &&
  129.         tmp == buf ) {
  130.         if ( ExecMode ) {
  131.         /* æOâfü[â^é╠âëâCâôÉöé╞û{æ╠âüâbâZü[âWé≡Åæé½ì₧é▐ */
  132.         UpdateMessage( ) ;
  133.         endnumber = number ;
  134.         msgbody = fopen( BODYNAME, "w" ) ;
  135.         }
  136.         /* âwâbâ_ü[âfü[â^ë≡É═ & Åoù═ */
  137.         ReadHeader( ) ;
  138.  
  139.         if ( ExecMode ) {
  140.         /* Æìû┌âOâïü[âvÅIù╣â`âFâbâN */
  141.         if ( strcmp( dir, NowLogGenData ) != 0 ) {
  142.             /* ACTIVEâtâ@âCâïìXÉV */
  143.             UpdateActive( ) ;
  144.  
  145.             /* ÉVé╡éóâOâïü[âvû╝é≡ò\Ī */
  146.             fprintf( stderr, "\n%s", dir ) ;
  147.             strcpy( NowLogGenData, dir ) ;
  148.  
  149.         }
  150.         if ( ActiveMode )
  151.             fputc( '.', stderr ) ;
  152.         else
  153.             fputc( '*', stderr ) ;
  154.         } else {
  155.         printf( "%-28s No.%-6ld %d-%s-%2d %s %s ò╢ÄÜ=%-6ld ö¡ÉM: %-10s"
  156.                , &dir[4], number
  157.                , year, tuki, day, youbi, jikan
  158.                , MsgSize, name
  159.                ) ;
  160.         if ( re_num != 0 )
  161.             printf( " rep: %-6d", re_num ) ;
  162.         else
  163.             printf( "            " ) ;
  164.         printf( " òWæΦ: %s\n", subject ) ;
  165.         }
  166.         now = 0L;
  167.     }
  168.  
  169.     now += ( long )strlen( buf ) ;
  170.  
  171.     if ( ExecMode && ActiveMode ) {
  172.         /* âüâbâZü[âWâfü[â^û{ò╢Åæé½ì₧é▌ */
  173.         if ( now <= MsgSize ) {
  174.         if ( *buf != 0xff ) {
  175.             fputs( buf, msgbody ) ;
  176.             ++lines ;
  177.         }
  178.         }
  179.     }
  180.     }
  181.     if ( ExecMode && ActiveMode ) {
  182.     /* ì┼îπé╠âfü[â^é╠âëâCâôÉöé╞û{æ╠âüâbâZü[âWé≡Åæé½ì₧é▐ */
  183.     UpdateMessage( ) ;
  184.  
  185.     /* ì┼ÅIâüâbâZü[âWâOâïü[âvé╠ACTIVEìXÉV */
  186.     UpdateActive( ) ;
  187.     }
  188.     /* âeâôâ|âëâèü[âtâ@âCâïîQé≡ìφÅ£ */
  189.     unlink( "dummy" ) ;
  190.     unlink( BODYNAME ) ;
  191.     return 0 ;
  192. }
  193.  
  194. /************************************************/
  195. /*                        */
  196. /*                        */
  197. /*                        */
  198. /************************************************/
  199. void ReadHeader( void )
  200. {
  201.     UCHAR    *tmp ;
  202.     UCHAR    cnumber[128] ;
  203.  
  204.     /* âwâbâ_ü[ë≡É═òöô╟é▌ì₧é▌ */
  205.     if ( fgets( buf, 2048, in ) == NULL )
  206.     exit( 1 ) ;
  207.  
  208. /*
  209.   âTâôâvâïüF
  210.   ibm.hardware/main 48ö╘, tal é⌐éτ, 430 ò╢ÄÜ, Fri Jun  4 00:40:16 1993
  211.  */
  212.     sscanf( buf, "%s %s %s %s %d %s %s %s %d %s %d"
  213.        , dir, cnumber, name, wbuf, &MsgSize
  214.        , wbuf, youbi, tuki, &day, jikan, &year
  215.        ) ;
  216.     number = atol( cnumber ) ;
  217.  
  218.     /* âOâïü[âvû╝É╢ɼ */
  219.     for ( tmp = dir ; *tmp; ++tmp )
  220.     if ( *tmp == '/' )
  221.         *tmp = '.' ;
  222.     strcpy( wbuf, "mix." ) ;
  223.     strcat( wbuf, dir ) ;
  224.     strcpy( dir, wbuf ) ;
  225.  
  226.     /* Åoù═âtâ@âCâïâfâBâîâNâgâèü[É╢ɼ */
  227.     for ( tmp = wbuf ; *tmp; ++tmp )
  228.     if ( *tmp == '.' )
  229.         *tmp = '/' ;
  230.     sprintf( OutDir, "%s/%s", UupcNewsDir, wbuf ) ;
  231.  
  232.     /* ÉVé╡éóâOâïü[âvé╠ô╟é▌ì₧é▌ÄwÆΦé≡â`âGâbâN */
  233.     CheckActive( ) ;
  234.  
  235.     if ( ExecMode && ActiveMode ) {
  236.     CreateDir( OutDir ) ;
  237.  
  238.     /* âüâbâZü[âWÅoù═âtâ@âCâïâIü[âvâô */
  239.     sprintf( wbuf, "%s/%d",OutDir, number ) ;
  240.     out = fopen( wbuf, "wb" ) ;
  241.     }
  242.  
  243.     /* âèâvâëâCâüâbâZü[âWö╘ìåÉ╢ɼ */
  244.     if ( fgets( buf, 2048, in ) == NULL )
  245.     exit( 1 ) ;
  246.  
  247.     /* âTâôâvâïüF é▒éΩé═ 56 é╓é╠âRâüâôâgé┼é╖üB*/
  248.     if ( strstr( buf, "é▒éΩé═" ) != 0 )
  249.     sscanf( buf, "%s %d", wbuf, &re_num ) ;
  250.     else
  251.     re_num = 0 ;
  252.  
  253.     /* âwâbâ_ü[âfü[â^é≡âXâLâbâvé╖éΘ */
  254.     do {
  255.     if ( ( tmp = strstr( buf, "--------------------------" ) ) != 0
  256.         && tmp == buf )
  257.         break ;
  258.     } while ( fgets( buf, 2048, in ) != NULL ) ;
  259.     fgets( buf, 2048, in ) ;
  260.  
  261.     /* âTâuâWâFâNâgÉ╢ɼ */
  262.     if ( strncmp( buf, "òWæΦüF", 6 ) == 0 ) {
  263.     for ( tmp = &buf[6] ; isspace( *tmp ) ; ++tmp ) ;
  264.     for ( ; strncmp( tmp, "ü@", 2 ) == 0; tmp += 2 ) ;
  265.     strcpy( subject, tmp ) ;
  266.     subject[ strlen(subject) -1] = 0 ;
  267.     *buf = 0xff ;
  268.     } else {
  269.     strcpy( subject, "ûóÆΦï`" ) ;
  270.     }
  271.  
  272.     if ( ExecMode && ActiveMode )
  273.     WriteHeader( ) ;
  274.     lines = 0L ;
  275. }
  276.  
  277. /************************************************/
  278. /*                        */
  279. /*                        */
  280. /*                        */
  281. /************************************************/
  282. void CreateDir( char *dir )
  283. {
  284.     UCHAR    tmpbuf[256] ;
  285.     int        len, pos ;
  286.  
  287.     if ( access( dir, 0 ) ) {
  288.     len = strlen( dir ) ;
  289.     pos = 0 ;
  290.     strcpy( tmpbuf, dir ) ;
  291.     while ( pos < len ) {
  292.         while ( tmpbuf[pos] != '/' && tmpbuf[pos] != 0 )
  293.         ++pos ;
  294.         if ( tmpbuf[pos] ) {
  295.         tmpbuf[pos] = 0 ;
  296.         mkdir( tmpbuf, 0L ) ;
  297.         tmpbuf[pos] = '/' ;
  298.         ++pos ;
  299.         }
  300.     }
  301.     mkdir( tmpbuf, 0L ) ;
  302.     }
  303. }
  304.  
  305. /************************************************/
  306. /*                        */
  307. /*                        */
  308. /*                        */
  309. /************************************************/
  310. void WriteHeader( void )
  311. {
  312.     UCHAR    *tmp, *tmp2 ;
  313.     int        findrep ;
  314.     FILE    *rep ;
  315.     UCHAR    reptmp[256] ;
  316.  
  317. /*
  318.   âTâôâvâï:
  319.   From: uchida@yrd.suzuki.co.jp (Uchida Hitoshi)
  320.   Newsgroups: fj.editor.mule,fj.sys.hp
  321.   Subject: Mule and Canna on HP-UX
  322.   Message-ID: <UCHIDA.94Jan27165350@yrd-gw.yrd.suzuki.co.jp>
  323.   References: <NTAKAHAS.94Feb2212941@etlnao.etl.go.jp>
  324.   Date: 27 Jan 94 07:53:50 GMT
  325.   Lines: 20
  326.   */
  327.     /* âüâbâZü[âWéhécÉ╢ɼ */
  328.     for ( tmp = wbuf, tmp2 = name; *tmp2; ++tmp, ++tmp2 )
  329.     *tmp = toupper( *tmp2 ) ;
  330.     *tmp = 0 ;
  331.     sprintf( messageid, "<%s.%d%s%02d%s@mix.or.jp>",
  332.         wbuf, year-1900, tuki, day, jikan ) ;
  333.     /* Ä₧è╘âeü[â^ôαé╠":"é≡ìφÅ£ */
  334.     for( tmp = tmp2 = messageid; *tmp2; ++tmp, ++tmp2 ) {
  335.     if ( *tmp2 == ':' )
  336.         ++tmp2 ;
  337.     *tmp = *tmp2 ;
  338.     }
  339.     *tmp = 0 ;
  340.  
  341.     /* âèâvâëâCé¬ùLé┴é╜ÅΩìçé═âTâuâWâFâNâgé≡ò╧ìX */
  342.     if ( re_num ) {
  343.     findrep = 0 ;
  344.     sprintf( wbuf, "%s/%d", OutDir, re_num ) ;
  345.     if ( ( rep = fopen( wbuf, "r" ) ) ) {
  346.         fgets( wbuf, 256, rep ) ; /* skip Newsgroups: */
  347.         fgets( wbuf, 256, rep ) ; /* skip From: */
  348.  
  349.         /* Subjectô╟é▌ì₧é▌ */
  350.         fgets( wbuf, 256, rep ) ;
  351.         strcpy( reptmp, &wbuf[9] ) ;
  352.         if ( strncmp( reptmp, "Re: ", 4 ) )
  353.         sprintf( subject, "%Re: %s", reptmp ) ;
  354.         else
  355.         strcpy( subject, reptmp ) ;
  356.         subject[ strlen( subject ) -1 ] = 0 ;
  357.  
  358.         /* âèâtâ@âîâôâXùpâüâbâZü[âWIDÉ▌ÆΦ */
  359.         fgets( wbuf, 256, rep ) ;
  360.         strcpy( reptmp, &wbuf[12] ) ;
  361.         reptmp[ strlen( reptmp ) -1 ] = 0 ;
  362.  
  363.         findrep = 1 ;
  364.         fclose( rep ) ;
  365.     }
  366.     }
  367.  
  368.     /* âwâbâ_ü[é≡Åoù═ */
  369.     DataWrite( "Newsgroups: %s\n", dir ) ;
  370.     DataWrite( "From: %s@mix.or.jp <%s>\n", name, name ) ;
  371.     DataWrite( "Subject: %s\n", subject ) ;
  372.     DataWrite( "Message-ID: %s\n", messageid ) ;
  373.     if ( re_num ) {
  374.     if ( findrep )
  375.         DataWrite( "References: %s\n", reptmp ) ;
  376.     else
  377.         DataWrite( "References: <%dé╠âüâbâZü[âWé¬û│éó>\n", re_num ) ;
  378.     }
  379.     DataWrite( "Date: %2d %s %d %s\n", day, tuki, year, jikan ) ;
  380. }
  381.  
  382. /************************************************/
  383. /*                        */
  384. /*                        */
  385. /*                        */
  386. /************************************************/
  387. void DataWrite( const char *fmt, ... )
  388. {
  389.     va_list    ap;
  390.     int        kanjimode ;
  391.     UCHAR    tmpbuf[256], *pos, *data, hi, low ;
  392.     USHORT    jiskanji ;
  393.  
  394.     va_start( ap, fmt ) ;
  395.     vsprintf( tmpbuf, fmt, ap ) ;
  396.     va_end( ap ) ;
  397.  
  398.     kanjimode = 0 ;
  399.     pos = OutMsgBuf ;
  400.     data = tmpbuf ;
  401.     while ( *data ) {
  402.     if ( isKANJI( *data ) ) {
  403.         if ( !kanjimode ) {
  404.         /* è┐ÄÜéhémÅoù═ */
  405.         *pos++ = 0x1b ; *pos++ = '$' ; *pos++ = 'B' ;
  406.         kanjimode = 1 ;
  407.         }
  408.         hi = *data++ ;
  409.         low = *data++ ;
  410.         jiskanji = SJIStoJIS( hi, low ) ;
  411.         *pos++ = (UCHAR)( jiskanji >> 8 ) ;
  412.         *pos++ = (UCHAR)( jiskanji & 0xff ) ;
  413.     } else {
  414.         if ( kanjimode ) {
  415.         /* è┐ÄÜénétésÅoù═ */
  416.         *pos++ = 0x1b ;    *pos++ = '(' ;    *pos++ = 'B' ;
  417.         kanjimode = 0 ;
  418.         }
  419.         *pos++ = *data++ ;
  420.     }
  421.     }
  422.     *pos = 0 ;
  423.     fputs( OutMsgBuf, out ) ;
  424. }
  425.  
  426. /************************************************/
  427. /*                        */
  428. /*                        */
  429. /*                        */
  430. /************************************************/
  431. USHORT SJIStoJIS( UCHAR byte1, UCHAR byte2 )
  432. {
  433.     USHORT    c;
  434.     USHORT    byte_1, byte_2 ;
  435.  
  436.     byte_1 = ( USHORT )byte1 ;
  437.     byte_2 = ( USHORT )byte2 ;
  438.  
  439.     byte_1 -= (byte_1 >= 0xa0) ? 0xc1 : 0x81 ;
  440.     if (byte_2 >= 0x9f) {
  441.     c = (byte_1 << 9) + 0x2200 ;
  442.     c |= byte_2 - 0x7e ;
  443.     } else {
  444.     c = (byte_1 << 9) + 0x2100 ;
  445.     c |= byte_2 - ((byte_2 <= 0x7e) ? 0x1f : 0x20) ;
  446.     }
  447.     return ( c ) ;
  448. }
  449.  
  450. /************************************************/
  451. /*                        */
  452. /*                        */
  453. /*                        */
  454. /************************************************/
  455. void UpdateMessage( void )
  456. {
  457.     struct utimbuf    otime ;
  458.     struct tm        otm ;
  459.     time_t        oOrgTime ;
  460.     UCHAR        mondata[] = "JanFebMarAprMayJunJulAugSepOctNovDec" ;
  461.     UCHAR        *pos ;
  462.  
  463.     DataWrite( "Lines: %d\n\n", lines ) ;
  464.     fclose( msgbody ) ;
  465.     msgbody = fopen( BODYNAME, "r" ) ;
  466.     while ( fgets( buf, 2048, msgbody ) != NULL )
  467.     DataWrite( "%s", buf ) ;
  468.     fclose( out ) ;
  469.     fclose( msgbody ) ;
  470.     if ( ( pos = strstr( mondata, tuki ) ) == NULL )
  471.     return ;
  472.     sscanf( jikan, "%d:%d:%d", &otm.tm_hour, &otm.tm_min, &otm.tm_sec ) ;
  473.     otm.tm_mday = day ;
  474.     otm.tm_mon = ( int )( pos - mondata ) / 3 ;
  475.     otm.tm_year = year - 1900 ;
  476.     otm.tm_isdst = 0 ;
  477.     oOrgTime = mktime( &otm ) ;
  478.     otime.actime = oOrgTime ;
  479.     otime.modtime = oOrgTime ;
  480.     sprintf( wbuf, "%s/%d", OutDir,number ) ;
  481.     utime( wbuf, &otime ) ;
  482. }
  483.  
  484. /************************************************/
  485. /*                        */
  486. /*                        */
  487. /*                        */
  488. /************************************************/
  489. void UpdateActive( void )
  490. {
  491.     FILE    *old, *new ;
  492.     UCHAR    grp[128] ;
  493.     long    str, end ;
  494.     UCHAR    mode[4] ;
  495.     UCHAR    tmp[256] ;
  496.  
  497.     strcpy( wbuf, ActiveFile ) ;
  498.     strcat( wbuf, ".old" ) ;
  499.     rename( ActiveFile, wbuf ) ;
  500.  
  501.     old = fopen( wbuf, "r" ) ;
  502.     new = fopen( ActiveFile, "wb" ) ;
  503.     while ( fgets( tmp, 256, old ) != NULL ) {
  504.     /* âTâôâvâï: mix.system.news.main 1016 1008 y */
  505.     sscanf( tmp, "%s %ld %ld %s", grp, &end, &str, mode ) ;
  506.     if ( strcmp( grp, NowLogGenData ) == 0 && end < endnumber )
  507.         sprintf( tmp, "%s %ld %ld %s\n", grp, endnumber, str, mode ) ;
  508.     fputs( tmp, new ) ;
  509.     }
  510.     fclose( old ) ;
  511.     fclose( new ) ;
  512.     unlink( wbuf ) ;
  513. }
  514.  
  515. /************************************************/
  516. /*                        */
  517. /*                        */
  518. /*                        */
  519. /************************************************/
  520. void CheckActive( void )
  521. {
  522.     FILE    *active ;
  523.     UCHAR    grp[128] ;
  524.     long    str, end ;
  525.     UCHAR    mode[4] ;
  526.     UCHAR    tmp[256] ;
  527.  
  528.     ActiveMode = 0 ;
  529.     active = fopen( ActiveFile, "r" ) ;
  530.     while ( fgets( tmp, 256, active ) != NULL ) {
  531.     /* âTâôâvâï: mix.system.news.main 1016 1008 y */
  532.     sscanf( tmp, "%s %ld %ld %s", grp, &end, &str, mode ) ;
  533.     if ( !strcmp( grp, dir ) ) {
  534.         if ( !strcmp( mode, "y" ) || !strcmp( mode, "m" ) )
  535.         ActiveMode = 1 ;
  536.         break ;
  537.     }
  538.     }
  539.     fclose( active ) ;
  540. }
  541.  
  542. /********************************************************/
  543. /*                            */
  544. /*    UUPCÉ▌ÆΦè┬ï½ô╟é▌ĵéΦÅêù¥            */
  545. /*                            */
  546. /*    òKùvé╚É▌ÆΦìÇû┌é≡ô╟é▌ì₧é▌èeò╧Éöé╔ò█æ╢é╖éΘ    */
  547. /*                            */
  548. /********************************************************/
  549. void GetConfigData( char *rcname )
  550. {
  551.     char    *fname, *pos ;
  552.     FILE    *fp ;
  553.     int        lp, find ;
  554.     char    tmp[BUFFER_SIZE] ;
  555.  
  556.     fname = getenv( rcname ) ;
  557.     fp = fopen( fname, "r" ) ;
  558.     while ( fgets( tmp, BUFFER_SIZE, fp ) != NULL ) {
  559.     /* âRâüâôâgìsé═âXâLâbâv */
  560.     if ( *tmp == '#' )
  561.         continue ;
  562.  
  563.     /* Éµô¬é╠ï≤öÆé≡Å┴é╡üAï≤ìsé╚éτâXâLâbâv */
  564.     pos = tmp ;
  565.     while ( isspace( *pos ) ) ++pos ;
  566.     if ( *pos == '\0' )
  567.         continue ;
  568.     strcpy( wbuf, pos ) ;
  569.  
  570.     /* ÅIéφéΦé╠ï≤öÆéαìφÅ£é╖éΘ */
  571.     pos = strstr( wbuf, "\n" ) ;
  572.     while ( isspace( *pos ) ) --pos ;
  573.     *(++pos) = '\0' ;
  574.  
  575.     /* âRâôâtâBâOÄ»ò╩Äqé≡É╪éΦÅoé╖ */
  576.     strcpy( tmp, wbuf ) ;
  577.     if ( ( pos = strstr( tmp, "=" ) ) == NULL )
  578.         continue ;
  579.     *pos = '\0' ;
  580.     strcpy( wbuf, wbuf + ( pos - tmp ) + 1 ) ;
  581.  
  582.     /* âRâôâtâBâOÄ»ò╩Äqé≡żò╢ÄÜë╗é╖éΘ */
  583.     for ( pos = tmp ; *pos ; ++pos )
  584.         *pos = ( char )tolower( *pos ) ;
  585.  
  586.     lp = find = 0 ;
  587.     while ( Conf[lp].name != NULL ) {
  588.         if ( strstr( tmp, Conf[lp].name ) == tmp ) {
  589.         find = lp + 1 ;
  590.         break ;
  591.         }
  592.         ++lp ;
  593.     }
  594.     if ( !find )
  595.         continue ;
  596.     --find ;
  597.  
  598.     if ( *Conf[find].value == NULL ) {
  599.         *Conf[find].value = malloc( strlen( wbuf ) + 1 ) ;
  600.     } else {
  601.         *Conf[find].value = realloc( *Conf[find].value,
  602.                     strlen( wbuf ) + 1 ) ;
  603.     }
  604.     strcpy( Conf[find].value[0], wbuf ) ;
  605.     }
  606. }
  607.  
  608. /********************************************************/
  609. /*                            */
  610. /*    UUPCâRâôâtâBâOâtâ@âCâïùpò╧Éöé╠èJò·        */
  611. /*                            */
  612. /********************************************************/
  613. void FreeUupcValue( )
  614. {
  615.     int        lp ;
  616.  
  617.     lp = 0 ;
  618.     while ( Conf[lp].name != NULL ) {
  619.     if ( *Conf[lp].value != NULL ) {
  620.         free( *Conf[lp].value ) ;
  621.     }
  622.     ++lp ;
  623.     }
  624. }
  625.