home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus Leser 16 / AmigaOS_LeserCD16_02.bin / Online / newsspeech / src / newsspeech.c < prev   
C/C++ Source or Header  |  2002-05-19  |  9KB  |  380 lines

  1. /*
  2.     HTTP based News site reader by LouiSe 2002 louise@louise.amiga.hu
  3.  
  4.  
  5.  
  6.     HISTORY
  7.  
  8.  
  9.     20020420    v0.4    TEMP filename fix (number to string)
  10.  
  11.     20020419    v0.3    not release
  12.  
  13.     20020419    v0.2    first public release
  14.  
  15. */
  16.  
  17. #define    PROGRAMVERSION    "$VER: 0.4 (20/apr/2002)"
  18.  
  19. #define    MAXCONFIGS    100
  20. #define    MAXFN        256
  21. #define    CONFIGDIR    "sites"
  22. #define    TOOLSDIR    "tools"
  23. #define    TEMPDIR        "temp"
  24.  
  25. #include    <stdio.h>
  26. #include    <string.h>
  27. #include    <unistd.h>
  28. #include    <stdlib.h>
  29.  
  30. int    VERBOSE=0;            // set verbosity with value = 1
  31. int    CGIMODE=0;            // set CGI mode with value = 1
  32.  
  33. int    CONFIGS=0;            // the number of config files in use
  34. char    conf_fn[MAXCONFIGS][MAXFN];    // the config file names
  35. char    conf_gr[MAXCONFIGS][MAXFN];    // GRAB field for grab the URL
  36. char    conf_sa[MAXCONFIGS][MAXFN];    // SAY field for speech the words
  37. int    conf_re[MAXCONFIGS];        // RELOAD field the reload times for config file names/sites
  38. char    conf_st[MAXCONFIGS][MAXFN];    // START field for start of searching
  39. char    conf_so[MAXCONFIGS][MAXFN];    // STOP field for stop of searching
  40. int    conf_counter[MAXCONFIGS];    // the counter for a site reload delay
  41.  
  42. char    currdir[MAXFN];
  43.  
  44.  
  45. void    printhelp()
  46. {
  47.     printf("Usage: newsspeech [options] [config files]\n\n");
  48.     
  49.     printf("Arguments:\n");
  50.     printf(" -h\tThis help page\n");
  51.     printf(" -v\tVerbose mode\n");
  52.     printf(" -c\tRun in CGI mode for web servers\n");
  53.     printf("\n");
  54. }
  55.  
  56.  
  57. char    *getconfline(char *filename, char *field)
  58. {
  59.     FILE    *fh;
  60.     char    buff[MAXFN];
  61.     static char    fieldvalue[MAXFN];
  62.     char    *ptr;
  63.         
  64.     memset(fieldvalue,0,sizeof(fieldvalue));
  65.     
  66.     if((fh=fopen(filename,"r"))==NULL)
  67.     {
  68.         if(VERBOSE==1) printf("Config file %s NOT FOUND!\n",filename);    
  69.         return(NULL);
  70.     }
  71.     else
  72.         {
  73.         while(!feof(fh))
  74.         {
  75.             memset(buff,0,sizeof(buff));
  76.             if(!fgets(buff,sizeof(buff)-1,fh)) break;
  77.             if(strncasecmp(buff,field,strlen(field))==0)
  78.             {
  79.             strtok(buff,"\t ");
  80.             ptr=strtok(NULL,"\n");
  81.             if(ptr!=NULL) strcpy(fieldvalue,ptr);
  82.             }
  83.         }
  84.         fclose(fh);
  85.         }        
  86.  
  87.     return(fieldvalue);
  88. }
  89.  
  90.  
  91. int    buildconf(char *filename, int confnum)
  92. {
  93.     int        configz=0;
  94.     int        creload=0;
  95.     char    *ptr;
  96.             
  97.     if(confnum!=-1)
  98.     {
  99.         // config reload...
  100.         configz=CONFIGS;
  101.         CONFIGS=confnum;
  102.     }
  103.  
  104.     ptr=getconfline(filename,"RELOAD:");
  105.     if(ptr!=NULL)
  106.     {
  107.         strcpy(conf_fn[CONFIGS],filename);
  108.         if(VERBOSE==1) printf("%.2d Config file is '%s'\n",CONFIGS,conf_fn[CONFIGS]);
  109.     }
  110.     else return(-1);
  111.  
  112.     if(ptr!=NULL)
  113.     {
  114.         creload=atoi(ptr);
  115.         if(creload>0)
  116.         {
  117.         conf_re[CONFIGS]=creload;
  118.         if(VERBOSE==1) printf("\tRELOAD=%d\n",conf_re[CONFIGS]);
  119.         }
  120.         else if(VERBOSE==1) printf("\tInvalid RELOAD value in Config file '%s' !\n",filename);
  121.     }
  122.  
  123.     ptr=getconfline(filename,"GRAB:");
  124.     if(ptr!=NULL)
  125.     {
  126.         strcpy(conf_gr[CONFIGS],ptr);
  127.         if(VERBOSE==1) printf("\tGRAB=%s\n",conf_gr[CONFIGS]);
  128.     }
  129.     else if(VERBOSE==1) printf("Invalid GRAB value in Config file '%s' !\n",filename);
  130.  
  131.     ptr=getconfline(filename,"SAY:");
  132.     if(ptr!=NULL)
  133.     {
  134.         strcpy(conf_sa[CONFIGS],ptr);
  135.         if(VERBOSE==1) printf("\tSAY=%s\n",conf_sa[CONFIGS]);
  136.     }
  137.     else if(VERBOSE==1) printf("Invalid SAY value in Config file '%s' !\n",filename);
  138.  
  139.     ptr=getconfline(filename,"START:");
  140.     if(ptr!=NULL)
  141.     {
  142.         strcpy(conf_st[CONFIGS],ptr);
  143.         if(VERBOSE==1) printf("\tSTART=%s\n",conf_st[CONFIGS]);
  144.     }
  145.     else if(VERBOSE==1) printf("Invalid START value in Config file '%s' !\n",filename);
  146.  
  147.     ptr=getconfline(filename,"STOP:");
  148.     if(ptr!=NULL)
  149.     {
  150.         strcpy(conf_so[CONFIGS],ptr);
  151.         if(VERBOSE==1) printf("\tSTOP=%s\n",conf_so[CONFIGS]);
  152.     }
  153.     else if(VERBOSE==1) printf("Invalid STOP value in Config file '%s' !\n",filename);
  154.  
  155.     if(confnum!=-1)
  156.     {
  157.         // config resetting
  158.         CONFIGS=configz;
  159.     }
  160.  
  161.     CONFIGS++;
  162.     if(CONFIGS>=MAXCONFIGS)
  163.     {
  164.         if(VERBOSE==1) printf("Sorry maximum number of config file stack %d is exceed\n",MAXCONFIGS);
  165.     }
  166.  
  167.  
  168.  
  169.     return(configz);
  170. }
  171.  
  172.  
  173. int    getlines(char *filename, char *starts, char *stops, char *speech, int confnum)
  174. {
  175.     FILE    *fh,*fh2;
  176.     char    filenameout[MAXFN];
  177.     char    buff[MAXFN*4],newsline[MAXFN*2];
  178.     int        skipped=0,ret=0;
  179.     char    *ss;
  180.     char    execute[MAXFN*2];
  181.     
  182.     memset(filenameout,0,sizeof(filenameout));
  183.     sprintf(filenameout,"%s.out",filename);
  184.     
  185.     if((fh=fopen(filename,"r"))==NULL)
  186.     {
  187.     if(VERBOSE==1) printf("Couldn't open temp file '%s' for read !\n",filename);
  188.     return(-1);
  189.     }
  190.     else
  191.     {
  192.         if((fh2=fopen(filenameout,"r+"))==NULL)
  193.         {
  194.         if((fh2=fopen(filenameout,"w+"))==NULL) printf("Couldn't open temp file '%s' for read+write !\n",filenameout);
  195.         fclose(fh2);
  196.         }
  197.         else fclose(fh2);
  198.  
  199.         if((fh2=fopen(filenameout,"r+"))==NULL)
  200.         {
  201.         if(VERBOSE==1) printf("Couldn't open temp file '%s' for read+write !\n",filenameout);
  202.         
  203.         return(-1);
  204.         }
  205.         else
  206.         {
  207.                 // start to read from temp file, and write the analyzed lines to output file
  208.         
  209.             while(!feof(fh))
  210.             {
  211.             memset(buff,0,sizeof(buff));
  212.             if(!fgets(buff,sizeof(buff)-1,fh)) break;
  213.             if((ss=strstr(buff,starts))!=NULL)
  214.             {
  215.                 // found the starting mask
  216.                 memset(newsline,0,sizeof(newsline));
  217.                 strcpy(newsline,ss+strlen(starts));
  218.                 // printf("[%s][%s]\n",newsline,stops);
  219.                 ss=strstr(newsline,stops);
  220.                 if(ss!=NULL)
  221.                 {
  222.                 // printf("[%s] %d %d ",newsline,strlen(newsline),strlen(ss));
  223.                 newsline[strlen(newsline)-strlen(ss)]=0;
  224.                 // printf("[%s]\n",newsline);
  225.                 
  226.                 fseek(fh2,0L,SEEK_SET);
  227.                 skipped=0;
  228.                 while(!feof(fh2))
  229.                 {
  230.                     memset(buff,0,sizeof(buff));
  231.                     if(!fgets(buff,sizeof(buff)-1,fh2)) break;
  232.                     strtok(buff,"\n");
  233.                     if(strcmp(buff,newsline)==0)
  234.                     {
  235.                     // already on the database, skipping
  236.                     // printf("SKIPPED [%s]\n",newsline);
  237.                     skipped=1;
  238.                     break;
  239.                     }
  240.                 }
  241.                 
  242.                 if(skipped==0)
  243.                 {
  244.                     fseek(fh2,0L,SEEK_END);
  245.                     fprintf(fh2,"%s\n",newsline);
  246.                     printf("%s [%s]\n",conf_fn[confnum]+strlen(currdir)+strlen(CONFIGDIR)+2,newsline);
  247.                     // need to speech...
  248.                     
  249.                     memset(execute,0,sizeof(execute));
  250.                     sprintf(execute,speech,currdir,TOOLSDIR,newsline);
  251.     
  252.                     if(VERBOSE==1) printf("Execute '%s'\n",execute);
  253.                     ret=system(execute);    
  254.                     if(VERBOSE==1) printf("Execute OK (%d).\n",ret);
  255.                 }                
  256.                 }
  257.             }
  258.             
  259.             
  260.             
  261.             }
  262.         
  263.             fclose(fh2);
  264.         }
  265.     
  266.         fclose(fh);    
  267.     }
  268.  
  269.     return(ret);
  270. }
  271.  
  272.  
  273. int    analyzesite(int confnum)
  274. {
  275.     char    tempf[MAXFN];
  276.     char    execute[MAXFN*2];
  277.     int        ret=0;
  278.     
  279.     if(VERBOSE==1) printf("Reloading config values from file '%s' \n",conf_fn[confnum]);
  280.     buildconf(conf_fn[confnum],confnum);    // reload the values from config file (for changes too)
  281.  
  282.     memset(tempf,0,sizeof(tempf));
  283.     // sprintf(tempf,"%s/%s/%d",currdir,TEMPDIR,confnum);
  284.     sprintf(tempf,"%s/%s/%s",currdir,TEMPDIR,conf_fn[confnum]+strlen(currdir)+strlen(CONFIGDIR)+2);
  285.     unlink(tempf);
  286.  
  287.     memset(execute,0,sizeof(execute));
  288.     sprintf(execute,conf_gr[confnum],currdir,TOOLSDIR,tempf);
  289.     
  290.     if(VERBOSE==1) printf("Execute '%s'\n",execute);
  291.     ret=system(execute);    
  292.     if(VERBOSE==1) printf("Execute OK (%d).\n",ret);
  293.     if(ret!=0) return(ret);
  294.     
  295.     getlines(tempf,conf_st[confnum],conf_so[confnum],conf_sa[confnum],confnum);
  296.         
  297.     return(0);
  298. }
  299.  
  300.  
  301. int    main(int argc, char *argv[])
  302. {
  303.     int        i=0,argok=0;
  304.     char    cfile[MAXFN];
  305.  
  306.     
  307.     printf("NewsSpeech %s by LouiSe (louise@louise.amiga.hu)\n\n",PROGRAMVERSION);
  308.         
  309.     if(argc>1)
  310.     {
  311.     getcwd(currdir, sizeof(currdir));
  312.     if(VERBOSE==1) printf("Current working directory is '%s'\n",currdir);
  313.  
  314.     if(VERBOSE==0) printf("Configuration files:\n");
  315.     
  316.     for(i=0;i<argc;i++)
  317.     {
  318.         argok=0;
  319.         // printf("%s\n",argv[i]);
  320.         if(strcasecmp(argv[i],"-h")==0) { printhelp(); argok=1; };
  321.         if(strcasecmp(argv[i],"-v")==0) { VERBOSE=1; argok=1; };
  322.         if(strcasecmp(argv[i],"-c")==0) { CGIMODE=1; argok=1; };
  323.         if(argok==0)
  324.         {
  325.         // the argument seems to a config file name...
  326.         memset(cfile,0,sizeof(cfile));
  327.         sprintf(cfile,"%s/%s/%s",currdir,CONFIGDIR,argv[i]);
  328.         buildconf(cfile,-1);
  329.         printf("%s\n",conf_fn[CONFIGS-1]+strlen(currdir)+strlen(CONFIGDIR)+2);
  330.         }
  331.     }        
  332.     
  333.     }
  334.     else
  335.     {
  336.         printhelp();
  337.     
  338.     }
  339.  
  340.  
  341.     if(CONFIGS>0)
  342.     {
  343.     // going to the work...
  344.     printf("\nNewsSpeech is running with %d preloaded config file(s)...\n",CONFIGS);
  345.     for(i=0;i<CONFIGS;i++) conf_counter[i]=conf_re[i];    // setting up the counters...
  346.     
  347.     while(1)
  348.     {
  349.         sleep(1);
  350.     
  351.         for(i=0;i<CONFIGS;i++)
  352.         {
  353.         conf_counter[i]--;                // decrease the counters...
  354.         if(conf_counter[i]==0)
  355.         {
  356.             // start the GRAB, analyze and the speech...        
  357.             if(VERBOSE==1) printf("Starting with '%s' (RELOAD=%d second(s))...\n",conf_fn[i]+strlen(currdir)+strlen(CONFIGDIR)+2,conf_re[i]);
  358.             analyzesite(i);
  359.  
  360.  
  361.             conf_counter[i]=conf_re[i];            // resetting counter value
  362.         }    
  363.         }
  364.         
  365.         
  366.     
  367.     
  368.     }
  369.     }
  370.     else
  371.     {
  372.         printf("There is no config files to run, exiting.\n");
  373.     
  374.     }
  375.  
  376.  
  377.  
  378.     return(0);
  379. }
  380.