home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 5 Edit / 05-Edit.zip / muleos2.zip / omake.zip / newsconv.c < prev   
C/C++ Source or Header  |  1994-02-18  |  6KB  |  231 lines

  1. /*
  2.   uupcùp âjâàü[âXâRâôâoü[âgâvâìâOâëâÇ    by O.Sasaki 1993.11
  3.  
  4.   uupc rnews é¬ ò█æ╢é╖éΘâjâàü[âXâfü[â^é╠EOL鬠CR/LF é╔é╚é┴é─éóéΘé╠é¬
  5.   GNUSé┼ê╡éñÅπé┼Ä╫ûéé╚é╠é┼üAEOLé≡LFé╠é▌é╔âRâôâoü[âgé╖éΘâvâìâOâëâÇé┼é╖üB
  6.  
  7.   uupc rnewsé≡ò╧ìXé≡é╖éΘé╠é¬êΩö╘éóéóé╠é┼é╖é¬üAî┬Élé╔éµé┴é─æûé┴é─éóéΘ
  8.   uupcé╠âoü[âWâçâôé¬êßéñé╠é┼üAì╖ò¬é≡ì∞éΘé╠é¬û╩ô|é╛é┴é╜é╜é▀üA
  9.   ÅoùêÅπé¬é┴é─âeâLâXâgé⌐éτCRé≡ìφÅ£é╖éΘéµéñé╔é╡é▄é╡é╜üB
  10.  
  11.   é▒é╠ò√û@é≡ì╠ùpé╡é╜é╠é═üAGNUSê╙èOé┼âjâàü[âXé≡ô╟é±é┼éóéΘÉlé╔é═üAEOLé¬
  12.   é╟éñé╚é┴é─éóé─éαè╓îWé╚éóé╡üAuupcé╠âoü[âWâçâôé¬éóé¡é┬é┼éαüAâjâàü[âXé≡
  13.   ô╟é▀éΘéµéñé╚è┬ï½é¬é┼é½é│éóé╖éΩé╬üAGNUSé┼âjâàü[âXé¬ô╟é▀éΘéµéñé╔é╚éΘ
  14.   ôÖé╠ùÿô_é¬ùLéΦé▄é╖üB
  15.  
  16. */
  17.  
  18. #include <stdio.h>
  19. #include <stdlib.h>
  20. #include <string.h>
  21. #include <ctype.h>
  22. #include <time.h>
  23. #include <sys/types.h>
  24. #include <sys/stat.h>
  25. #include <sys/utime.h>
  26.  
  27. #define BUFFER_SIZE 256
  28. #define HEADER_SIZE 2048
  29.  
  30. typedef struct {
  31.     char *name ;
  32.     char **value ;
  33. } CONFIGDATA ;
  34.  
  35. char    TmpName[] = "_)news(_.tmp" ;
  36.  
  37. char    wbuf[HEADER_SIZE] ;    /* ö─ùpâÅü[âNâoâbâtâ@            */
  38. char    nbuf[BUFFER_SIZE] ;    /* ÉVâAâNâeâBâuôⁿù═âoâbâtâ@        */
  39. char    newsdir[BUFFER_SIZE] ;    /* âjâàü[âXâfâBâîâNâgâèü[        */
  40. char    newsfile[BUFFER_SIZE] ;    /* âjâàü[âXâtâ@âCâï            */
  41. char    newstmp[BUFFER_SIZE] ;    /* âjâàü[âXâtâ@âCâï            */
  42.  
  43. char    *UupcConfDir = NULL ;    /* UUPCâRâôâtâBâOâfâBâîâNâgâèü[        */
  44. char    *UupcNewsDir = NULL ;    /* UUPCâjâàü[âXâfâBâîâNâgâèü[        */
  45.  
  46. struct stat sb ;
  47. struct utimbuf tb ;
  48.  
  49. CONFIGDATA    Conf[] = {
  50.     { "confdir",    &UupcConfDir        } ,
  51.     { "newsdir",    &UupcNewsDir        } ,
  52.     { NULL, NULL }
  53. } ;
  54.  
  55. /********************************************************/
  56. /*                            */
  57. /*    UUPCÉ▌ÆΦè┬ï½ô╟é▌ĵéΦÅêù¥            */
  58. /*                            */
  59. /*    òKùvé╚É▌ÆΦìÇû┌é≡ô╟é▌ì₧é▌èeò╧Éöé╔ò█æ╢é╖éΘ    */
  60. /*                            */
  61. /********************************************************/
  62. void GetConfigData( char *rcname )
  63. {
  64.     char    *fname, *pos ;
  65.     FILE    *fp ;
  66.     int        lp, find ;
  67.     char    tmp[BUFFER_SIZE] ;
  68.  
  69.     fname = getenv( rcname ) ;
  70.     fp = fopen( fname, "r" ) ;
  71.     while ( fgets( tmp, BUFFER_SIZE, fp ) != NULL ) {
  72.     /* âRâüâôâgìsé═âXâLâbâv */
  73.     if ( *tmp == '#' )
  74.         continue ;
  75.  
  76.     /* Éµô¬é╠ï≤öÆé≡Å┴é╡üAï≤ìsé╚éτâXâLâbâv */
  77.     pos = tmp ;
  78.     while ( isspace( *pos ) ) ++pos ;
  79.     if ( *pos == '\0' )
  80.         continue ;
  81.     strcpy( wbuf, pos ) ;
  82.  
  83.     /* ÅIéφéΦé╠ï≤öÆéαìφÅ£é╖éΘ */
  84.     pos = strstr( wbuf, "\n" ) ;
  85.     while ( isspace( *pos ) ) --pos ;
  86.     *(++pos) = '\0' ;
  87.  
  88.     /* âRâôâtâBâOÄ»ò╩Äqé≡É╪éΦÅoé╖ */
  89.     strcpy( tmp, wbuf ) ;
  90.     if ( ( pos = strstr( tmp, "=" ) ) == NULL )
  91.         continue ;
  92.     *pos = '\0' ;
  93.     strcpy( wbuf, wbuf + ( pos - tmp ) + 1 ) ;
  94.  
  95.     /* âRâôâtâBâOÄ»ò╩Äqé≡żò╢ÄÜë╗é╖éΘ */
  96.     for ( pos = tmp ; *pos ; ++pos )
  97.         *pos = ( char )tolower( *pos ) ;
  98.  
  99.     lp = find = 0 ;
  100.     while ( Conf[lp].name != NULL ) {
  101.         if ( strstr( tmp, Conf[lp].name ) == tmp ) {
  102.         find = lp + 1 ;
  103.         break ;
  104.         }
  105.         ++lp ;
  106.     }
  107.     if ( !find )
  108.         continue ;
  109.     --find ;
  110.  
  111.     if ( *Conf[find].value == NULL ) {
  112.         *Conf[find].value = malloc( strlen( wbuf ) + 1 ) ;
  113.     } else {
  114.         *Conf[find].value = realloc( *Conf[find].value,
  115.                     strlen( wbuf ) + 1 ) ;
  116.     }
  117.     strcpy( Conf[find].value[0], wbuf ) ;
  118.     }
  119. }
  120.  
  121. /********************************************************/
  122. /*                            */
  123. /*    UUPCâRâôâtâBâOâtâ@âCâïùpò╧Éöé╠èJò·        */
  124. /*                            */
  125. /********************************************************/
  126. void FreeUupcValue( )
  127. {
  128.     int        lp ;
  129.  
  130.     lp = 0 ;
  131.     while ( Conf[lp].name != NULL ) {
  132.     if ( *Conf[lp].value != NULL ) {
  133.         free( *Conf[lp].value ) ;
  134.     }
  135.     ++lp ;
  136.     }
  137. }
  138.  
  139. /********************************************************/
  140. /*                            */
  141. /*        âüâCâôÅêù¥é╛éµ                */
  142. /*                            */
  143. /********************************************************/
  144. main( int argc, char *argv[] )
  145. {
  146.     FILE    *new, *old, *in, *out ;
  147.     int        lp, len ;
  148.     int        start, end, dmy ;
  149.     char    *pnt ;
  150.  
  151.  
  152.     /* UUPCè┬ï½ÄµéΦì₧é▌ */
  153.     GetConfigData( "UUPCSYSRC" ) ;
  154.     GetConfigData( "UUPCUSRRC" ) ;
  155.  
  156.     strcpy( wbuf, UupcConfDir ) ;
  157.     strcat( wbuf, "/active" ) ;
  158.     if ( ( new = fopen( wbuf, "r" ) ) == NULL ) {
  159.     FreeUupcValue( ) ;
  160.     exit( 1 ) ;
  161.     }
  162.     strcpy( wbuf, UupcConfDir ) ;
  163.     strcat( wbuf, "/newsconv" ) ;
  164.     old = fopen( wbuf, "r" ) ;
  165.  
  166.     while ( fgets( nbuf, BUFFER_SIZE, new ) != NULL ) {
  167.     sscanf( nbuf, "%s %d %d", wbuf, &end, &start ) ;
  168.     for ( pnt = wbuf; *pnt; ++pnt )
  169.         if ( *pnt == '.' )
  170.         *pnt = '/' ;
  171.     sprintf( newsdir, "%s/%s", UupcNewsDir, wbuf ) ;
  172.     if ( old ) {
  173.         fgets( nbuf, BUFFER_SIZE, old ) ;
  174.         sscanf( nbuf, "%s %d", wbuf, &start ) ;
  175.         ++start ;
  176.     }
  177.     for ( lp = start; lp <= end; ++lp ) {
  178.         sprintf( newsfile, "%s/%d", newsdir, lp ) ;
  179.         sprintf( newstmp, "%s.tmp", newsfile ) ;
  180.         if ( stat( newsfile, &sb ) == -1 )
  181.         continue ;
  182.         tb.actime  = sb.st_atime ;
  183.         tb.modtime = sb.st_mtime ;
  184.  
  185.         in = fopen( newsfile, "rb" ) ;
  186.         fgets( wbuf, HEADER_SIZE, in ) ;
  187.         len = strlen( wbuf ) ;
  188.         if ( wbuf[len -2] != '\r' ) {
  189.         fclose( in ) ;
  190.         continue ;
  191.         }
  192.         out = fopen( newstmp, "wb" ) ;
  193.         do {
  194.         len = strlen( wbuf ) ;
  195.         if ( wbuf[len -2] == '\r' ) {
  196.             wbuf[len -2] = '\n' ;
  197.             wbuf[len -1] = '\0' ;
  198.         }
  199.         fputs( wbuf, out ) ;
  200.         } while ( fgets( wbuf, HEADER_SIZE, in ) != 0 ) ;
  201.         fclose( out ) ;
  202.         fclose( in ) ;
  203.  
  204.         strcpy( wbuf, newsfile ) ;
  205.         strcat( wbuf, ".bak" ) ;
  206.         if ( rename( newsfile, wbuf ) != -1 ) {
  207.         if ( rename( newstmp, newsfile ) != -1 ) {
  208.             utime( newsfile, &tb ) ;
  209.             unlink( wbuf ) ;
  210.         }
  211.         }
  212.         printf( "%s...done\n", newsfile ) ;
  213.     }
  214.     }
  215.     fclose( new ) ;
  216.     if ( old )
  217.     fclose( old ) ;
  218.  
  219.     strcpy( wbuf, UupcConfDir ) ;
  220.     strcat( wbuf, "/active" ) ;
  221.     new = fopen( wbuf, "r" ) ;
  222.     strcpy( wbuf, UupcConfDir ) ;
  223.     strcat( wbuf, "/newsconv" ) ;
  224.     old = fopen( wbuf, "w" ) ;
  225.     while ( fgets( nbuf, BUFFER_SIZE, new ) != NULL )
  226.     fputs( nbuf, old ) ;
  227.     fclose( new ) ;
  228.     fclose( old ) ;
  229.     return 0 ;
  230. }
  231.