## modules/up/UP_subject.c

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

## FUNCTIONS

This source file includes following functions.

1. up_classify_word
2. UP_subject_process

       1 /***************************************
       2   $Revision: 1.3 $
       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
      39 /*
      40    Classifies the given word. The word can be HELP, HOWTO or NEW
      41    up_classify_word may return UP_KEYWORD_HELP (for HELP & HOWTO),
      42    UP_KEYWORD_NEW (for NEW) or UP_KEYWORD_UNRECOG (for all others).
      43    Comparisons are case insensitive.
      44 */
      45 int up_classify_word(const char * word){
         /* [<][>][^][v][top][bottom][index][help] */
      46
      47   if(word == NULL){
      48     return UP_KEYWORD_UNRECOG;
      49   }
      50
      51   if( strcasecmp(word, "HOWTO") == 0 || strcasecmp(word, "HELP") == 0){
      52
      53     return UP_KEYWORD_HELP;
      54
      55   }else if( strcasecmp(word, "NEW") == 0){
      56
      57     return UP_KEYWORD_NEW;
      58
      59   }else{
      60
      61     return UP_KEYWORD_UNRECOG;
      62
      63   }
      64
      65 }
      66
      67
      68
      69
      70 /* UP_subject_process function gets the "Subject:" line of a
      71    update message and processes it. It tries to see if the
      72    words in the subject line are keywords that are recognised ones.
      73    The recognised ones are: HELP, HOWTO and NEW. The possible
      74    return values are UP_SUBJ_HELP_REQ, UP_SUBJ_NEW_ENFORCED,
      75    UP_SUBJ_UNRECOG and UP_SUBJ_ALL_UNRECOG.
      76
      77      UP_SUBJ_HELP_REQ means only HELP keyword is existent in the subject line
      78      UP_SUBJ_NEW_ENFORCED means only NEW keyword is existent in the subject line
      79      UP_SUBJ_UNRECOG means some unrecognised words found in subj line as well as
      80                at least one recognised one.
      81      UP_SUBJ_ALL_UNRECOG means all words were unrecognised ones (or subject
      82                             line was empty or non-existent)
      83      UP_SUBJ_INVALID_COMB means an invalid combination in given in the subject line.
      84    */
      85 up_subject_struct UP_subject_process(const char *arg){
         /* [<][>][^][v][top][bottom][index][help] */
      86
      87   up_subject_struct return_struct;
      88   char ** temp;
      89   int i;
      90   char * list_of_nonkeywords = NULL;
      91   char * subject_line = NULL;
      92
      93   subject_line = strdup(arg);
      94
      95
      96   /* initialize the struct */
      97   return_struct.result = UP_SUBJ_INIT;
      98
      99   list_of_nonkeywords = strdup("");
     100
     101   /* convert \t, \r, \n chars to white spaces */
     102   for(i=0; i < (strlen(subject_line)) ; i++){
     103
     104     if(   subject_line[i] == '\t' || subject_line[i] == '\n'
     105        || subject_line[i] == '\r' ){
     106       subject_line[i] = ' ';
     107     }
     108   }
     109
     110   /* split the string into lines */
     111   temp = g_strsplit (subject_line, " ", 0);
     112
     113   for(i=0; temp[i] != NULL; i++){
     114     if(strlen(temp[i]) > 0){
     115
     116       switch(up_classify_word(temp[i])){
     117         case UP_KEYWORD_HELP:
     118           switch(return_struct.result){
     119
     120             case UP_SUBJ_INIT:
     121               return_struct.result = UP_SUBJ_HELP_REQ; break;
     122             case UP_SUBJ_HELP_REQ: break;
     123             case UP_SUBJ_NEW_ENFORCED:
     124               return_struct.result = UP_SUBJ_UNRECOG; break;
     125             case UP_SUBJ_UNRECOG: break;
     126             case UP_SUBJ_ALL_UNRECOG:
     127               return_struct.result = UP_SUBJ_UNRECOG;  break;
     128             case UP_SUBJ_INVALID_COMB: break;
     129             default: ;
     130           }; break;
     131
     132
     133         case UP_KEYWORD_NEW:
     134           switch(return_struct.result){
     135
     136             case UP_SUBJ_INIT:
     137               return_struct.result = UP_SUBJ_NEW_ENFORCED; break;
     138             case UP_SUBJ_HELP_REQ:
     139               return_struct.result = UP_SUBJ_INVALID_COMB; break;
     140             case UP_SUBJ_NEW_ENFORCED: break;
     141             case UP_SUBJ_UNRECOG: break;
     142             case UP_SUBJ_ALL_UNRECOG:
     143               return_struct.result = UP_SUBJ_UNRECOG;  break;
     144             case UP_SUBJ_INVALID_COMB: break;
     145             default: ;
     146           }; break;
     147
     148         case UP_KEYWORD_UNRECOG:
     149
     150           if(strlen(list_of_nonkeywords) == 0){
     151             list_of_nonkeywords = (char *)realloc(list_of_nonkeywords,
     152                   strlen(temp[i]) + 1);
     153             list_of_nonkeywords = strcat(list_of_nonkeywords, temp[i]);
     154           }else{
     155              list_of_nonkeywords = (char *)realloc(list_of_nonkeywords,
     156                   strlen(list_of_nonkeywords) + strlen(temp[i]) + 2);
     157              list_of_nonkeywords = strcat(list_of_nonkeywords, " ");
     158              list_of_nonkeywords = strcat(list_of_nonkeywords, temp[i]);
     159           };
     160
     161           switch(return_struct.result){
     162
     163             case UP_SUBJ_INIT:
     164               return_struct.result = UP_SUBJ_ALL_UNRECOG; break;
     165             case UP_SUBJ_HELP_REQ:
     166               return_struct.result = UP_SUBJ_UNRECOG; break;
     167             case UP_SUBJ_NEW_ENFORCED:
     168               return_struct.result = UP_SUBJ_UNRECOG; break;
     169             case UP_SUBJ_UNRECOG: break;
     170             case UP_SUBJ_ALL_UNRECOG: break;
     171             case UP_SUBJ_INVALID_COMB:
     172               return_struct.result = UP_SUBJ_UNRECOG; break;
     173             default: ;
     174
     175           }; break;
     176         default: ;
     177       }
     178     }
     179   }
     180
     181   if(return_struct.result == UP_SUBJ_INIT){/* There were no words in the subject */
     182     return_struct.result = UP_SUBJ_ALL_UNRECOG;
     183   }
     184
     185   return_struct.word_list = list_of_nonkeywords;
     186
     187   free(subject_line);
     188
     189   return return_struct;
     190 }

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