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){
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){
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  | }