## modules/up/UP_subject.c

/* [<][>][^][v][top][bottom][index][help] */

## DEFINITIONS

This source file includes following functions.

1. up_classify_word
2. UP_subject_process
3. UP_subject_flags

       1 /***************************************
       2   $Revision: 1.5 $
       3
       4   UP subject line parsing
       5
       6   Status: NOT REVIEWED, TESTED
       7
       8   Author(s):       Engin Gunduz
       9
      10   ******************/ /******************
      11   Modification History:
      12         engin (19/03/2001) Created.
      13   ******************/ /******************
      14   Copyright (c) 2001,2002                         RIPE NCC
      15
      16   All Rights Reserved
      17
      18   Permission to use, copy, modify, and distribute this software and its
      19   documentation for any purpose and without fee is hereby granted,
      20   provided that the above copyright notice appear in all copies and that
      21   both that copyright notice and this permission notice appear in
      22   supporting documentation, and that the name of the author not be
      23   used in advertising or publicity pertaining to distribution of the
      24   software without specific, written prior permission.
      25
      26   THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
      27   ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS; IN NO EVENT SHALL
      28   AUTHOR BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY
      29   DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
      30   AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
      31   OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
      32  ***************************************/
      33
      34
      35 #include "UP_subject.h"
      36 #include "glib.h"
      37
      38 extern int help_requested;
      39 extern int enforced_new;
      40
      41 /*
      42    Classifies the given word. The word can be HELP, HOWTO or NEW
      43    up_classify_word may return UP_KEYWORD_HELP (for HELP & HOWTO),
      44    UP_KEYWORD_NEW (for NEW) or UP_KEYWORD_UNRECOG (for all others).
      45    Comparisons are case insensitive.
      46 */
      47 int up_classify_word(const char * word){
         /* [<][>][^][v][top][bottom][index][help] */
      48
      49   if(word == NULL){
      50     return UP_KEYWORD_UNRECOG;
      51   }
      52
      53   if( strcasecmp(word, "HOWTO") == 0 || strcasecmp(word, "HELP") == 0){
      54
      55     return UP_KEYWORD_HELP;
      56
      57   }else if( strcasecmp(word, "NEW") == 0){
      58
      59     return UP_KEYWORD_NEW;
      60
      61   }else{
      62
      63     return UP_KEYWORD_UNRECOG;
      64
      65   }
      66
      67 }
      68
      69
      70
      71
      72 /* UP_subject_process function gets the "Subject:" line of a
      73    update message and processes it. It tries to see if the
      74    words in the subject line are keywords that are recognised ones.
      75    The recognised ones are: HELP, HOWTO and NEW. The possible
      76    return values are UP_SUBJ_HELP_REQ, UP_SUBJ_NEW_ENFORCED,
      77    UP_SUBJ_UNRECOG and UP_SUBJ_ALL_UNRECOG.
      78
      79      UP_SUBJ_HELP_REQ means only HELP keyword is existent in the subject line
      80      UP_SUBJ_NEW_ENFORCED means only NEW keyword is existent in the subject line
      81      UP_SUBJ_UNRECOG means some unrecognised words found in subj line as well as
      82                at least one recognised one.
      83      UP_SUBJ_ALL_UNRECOG means all words were unrecognised ones (or subject
      84                             line was empty or non-existent)
      85      UP_SUBJ_INVALID_COMB means an invalid combination in given in the subject line.
      86    */
      87 up_subject_struct UP_subject_process(const char *arg){
         /* [<][>][^][v][top][bottom][index][help] */
      88
      89   up_subject_struct return_struct;
      90   char ** temp;
      91   int i;
      92   char * list_of_nonkeywords = NULL;
      93   char * subject_line = NULL;
      94
      95   subject_line = strdup(arg);
      96
      97
      98   /* initialize the struct */
      99   return_struct.result = UP_SUBJ_INIT;
     100
     101   list_of_nonkeywords = strdup("");
     102
     103   /* convert \t, \r, \n chars to white spaces */
     104   for(i=0; i < (strlen(subject_line)) ; i++){
     105
     106     if(   subject_line[i] == '\t' || subject_line[i] == '\n'
     107        || subject_line[i] == '\r' ){
     108       subject_line[i] = ' ';
     109     }
     110   }
     111
     112   /* split the string into lines */
     113   temp = g_strsplit (subject_line, " ", 0);
     114
     115   for(i=0; temp[i] != NULL; i++){
     116     if(strlen(temp[i]) > 0){
     117
     118       switch(up_classify_word(temp[i])){
     119         case UP_KEYWORD_HELP:
     120           switch(return_struct.result){
     121
     122             case UP_SUBJ_INIT:
     123               return_struct.result = UP_SUBJ_HELP_REQ; break;
     124             case UP_SUBJ_HELP_REQ: break;
     125             case UP_SUBJ_NEW_ENFORCED:
     126               return_struct.result = UP_SUBJ_INVALID_COMB; break;
     127             case UP_SUBJ_UNRECOG: break;
     128             case UP_SUBJ_ALL_UNRECOG:
     129               return_struct.result = UP_SUBJ_UNRECOG;  break;
     130             case UP_SUBJ_INVALID_COMB: break;
     131             default: ;
     132           }; break;
     133
     134
     135         case UP_KEYWORD_NEW:
     136           switch(return_struct.result){
     137
     138             case UP_SUBJ_INIT:
     139               return_struct.result = UP_SUBJ_NEW_ENFORCED; break;
     140             case UP_SUBJ_HELP_REQ:
     141               return_struct.result = UP_SUBJ_INVALID_COMB; break;
     142             case UP_SUBJ_NEW_ENFORCED: break;
     143             case UP_SUBJ_UNRECOG: break;
     144             case UP_SUBJ_ALL_UNRECOG:
     145               return_struct.result = UP_SUBJ_UNRECOG;  break;
     146             case UP_SUBJ_INVALID_COMB: break;
     147             default: ;
     148           }; break;
     149
     150         case UP_KEYWORD_UNRECOG:
     151
     152           if(strlen(list_of_nonkeywords) == 0){
     153             list_of_nonkeywords = (char *)realloc(list_of_nonkeywords,
     154                   strlen(temp[i]) + 1);
     155             list_of_nonkeywords = strcat(list_of_nonkeywords, temp[i]);
     156           }else{
     157              list_of_nonkeywords = (char *)realloc(list_of_nonkeywords,
     158                   strlen(list_of_nonkeywords) + strlen(temp[i]) + 2);
     159              list_of_nonkeywords = strcat(list_of_nonkeywords, " ");
     160              list_of_nonkeywords = strcat(list_of_nonkeywords, temp[i]);
     161           };
     162
     163           switch(return_struct.result){
     164
     165             case UP_SUBJ_INIT:
     166               return_struct.result = UP_SUBJ_ALL_UNRECOG; break;
     167             case UP_SUBJ_HELP_REQ:
     168               return_struct.result = UP_SUBJ_UNRECOG; break;
     169             case UP_SUBJ_NEW_ENFORCED:
     170               return_struct.result = UP_SUBJ_UNRECOG; break;
     171             case UP_SUBJ_UNRECOG: break;
     172             case UP_SUBJ_ALL_UNRECOG: break;
     173             case UP_SUBJ_INVALID_COMB:
     174               return_struct.result = UP_SUBJ_UNRECOG; break;
     175             default: ;
     176
     177           }; break;
     178         default: ;
     179       }
     180     }
     181   }
     182
     183   if(return_struct.result == UP_SUBJ_INIT){/* There were no words in the subject */
     184     return_struct.result = UP_SUBJ_ALL_UNRECOG;
     185   }
     186
     187   return_struct.word_list = list_of_nonkeywords;
     188
     189   free(subject_line);
     190
     191   return return_struct;
     192 }
     193
     194
     195
     196 /* UP_subject_flags function gets the "Subject" type flags
     197    and processes them.
     198    The flags are to represent: HELP and NEW. The possible
     199    return values are UP_SUBJ_HELP_REQ, UP_SUBJ_NEW_ENFORCED,
     200    UP_SUBJ_ALL_UNRECOG, UP_SUBJ_INVALID_COMB..
     201
     202      UP_SUBJ_HELP_REQ means only HELP flag is set.
     203      UP_SUBJ_NEW_ENFORCED means only NEW flag is set.
     204      UP_SUBJ_ALL_UNRECOG means no flags set.
     205      UP_SUBJ_INVALID_COMB means an invalid combination of flags set.
     206    */
     207 up_subject_struct UP_subject_flags(){
         /* [<][>][^][v][top][bottom][index][help] */
     208
     209   up_subject_struct return_struct;
     210   char * list_of_nonkeywords = NULL;
     211
     212   /* initialize the struct */
     213   return_struct.result = UP_SUBJ_INIT;
     214
     215   list_of_nonkeywords = strdup("");
     216
     217   if ( help_requested && enforced_new )
     218     return_struct.result = UP_SUBJ_INVALID_COMB;
     219   else if ( help_requested )
     220     return_struct.result = UP_SUBJ_HELP_REQ;
     221   else if ( enforced_new )
     222     return_struct.result = UP_SUBJ_NEW_ENFORCED;
     223
     224   if ( return_struct.result == UP_SUBJ_INIT ){
     225     /* There were no flags set */
     226     return_struct.result = UP_SUBJ_ALL_UNRECOG;
     227   }
     228
     229   return_struct.word_list = list_of_nonkeywords;
     230
     231   return return_struct;
     232 }

/* [<][>][^][v][top][bottom][index][help] */