Main Page   Class Hierarchy   Compound List   File List   Compound Members  

parser_msrp.cpp

00001 /*
00002  *  This program is free software; you can redistribute it and/or modify
00003  *  it under the terms of the GNU General Public License as published by
00004  *  the Free Software Foundation; either version 2 of the License, or
00005  *  (at your option) any later version.
00006  *
00007  *  This program is distributed in the hope that it will be useful,
00008  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00009  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00010  *  GNU General Public License for more details.
00011  *
00012  *  You should have received a copy of the GNU General Public License
00013  *  along with this program; if not, write to the Free Software
00014  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00015  *
00016  * (c)Copyright 2006 Hewlett-Packard Development Company, LP.
00017  *
00018  */
00019 
00020 #include "parser_msrp.hpp"
00021 #include "iostream_t.hpp"
00022 #include <regex.h>
00023 #include "string_t.hpp"
00024 #include "Utils.hpp"
00025 
00026 
00027 C_ProtocolFrame::T_MsgError parse_msrp (char   *P_buf,
00028                                         size_t *P_size,
00029                                         char   *P_buf_header,
00030                                         size_t  P_size_header) {
00031 
00032   //  C_ProtocolFrame::T_MsgError L_error = C_ProtocolFrame::E_MSG_ERROR_DECODING_SIZE_LESS ;
00033   C_ProtocolFrame::T_MsgError L_error = C_ProtocolFrame::E_MSG_OK;
00034 
00035   return (L_error) ;
00036 }
00037 
00038 
00039 char* skip_blank(char    *P_ptr, 
00040                  char    *P_buffer, 
00041                  size_t   P_size_buffer,
00042                  size_t  *P_size) {
00043   
00044   char     *L_blank_ptr    = NULL     ;
00045   char     *L_new_ptr      = P_ptr    ;
00046 
00047 
00048   L_blank_ptr = P_ptr ;
00049   while (((L_blank_ptr) && (L_blank_ptr < (P_buffer + P_size_buffer))) &&
00050          ((*L_blank_ptr == ' ') ||
00051           (*L_blank_ptr == '\t'))) { L_blank_ptr++ ; }
00052   if (L_blank_ptr != P_ptr) {
00053     *(P_size) = (L_blank_ptr - P_ptr) ;
00054     L_new_ptr = L_blank_ptr ;
00055   }
00056 
00057   return (L_new_ptr) ;
00058 }
00059 
00060 
00061 char * filter_msrp(char* P_buffer) {
00062 
00063   size_t    L_size         = 0        ;
00064 
00065   size_t    L_size_buffer  = 0        ;
00066   size_t    L_size_end     = 0        ;
00067   
00068   char     *L_pos          = NULL     ;
00069   char     *L_ptr          = P_buffer ;
00070 
00071   char     *L_result       = NULL     ;
00072   char     *L_new          = NULL     ;
00073 
00074   bool      L_skip_blank   = true     ;
00075   size_t    L_size_blank   = 0        ;
00076 
00077 
00078   if ((P_buffer != NULL) && 
00079       ((L_size_buffer = strlen(P_buffer)) > 0 )) {
00080 
00081     L_size_end = L_size_buffer ;
00082 
00083     ALLOC_TABLE(L_result, 
00084                 char*, 
00085                 sizeof(char), 
00086                 (2*L_size_buffer));
00087     
00088 
00089     if ((strchr(L_ptr,'\n')) == NULL) {
00090 
00091       L_new = L_result ;
00092       L_size = L_size_buffer ;
00093 
00094       // skip blank
00095       if (L_skip_blank) {
00096         L_ptr = skip_blank(L_ptr,P_buffer, L_size_buffer, &L_size_blank) ;
00097         L_size -= L_size_blank ;
00098       }
00099 
00100       memcpy(L_new, L_ptr, L_size);
00101       L_new += (L_size - 1) ;
00102       if (*L_new != '\r') {
00103         L_new += 1 ;
00104         *L_new = '\r' ;
00105       }
00106       L_new += 2 ;
00107       *L_new = '\0' ;
00108       *(L_new-1) = '\n' ;
00109 
00110     } else {
00111       // if '\n' exists
00112 
00113       while(   (L_ptr) 
00114             && (L_pos = strchr(L_ptr,'\n')) != NULL) {
00115 
00116         L_size_blank = 0 ;
00117         // L_size : from start to '\n' not included
00118         L_size = L_pos - L_ptr ;
00119         // skip blank
00120         if (L_skip_blank) {
00121 
00122           L_ptr = skip_blank(L_ptr,P_buffer, L_size_buffer, &L_size_blank) ;
00123           L_size -= L_size_blank ;
00124           L_size_end -= L_size_blank ;
00125 
00126         }
00127 
00128         if (L_new == NULL) { L_new = L_result ; } else { L_new += 1 ; }
00129         memcpy(L_new, L_ptr, L_size);
00130         L_new += (L_size - 1) ;
00131         // test end needed ? for L_ptr
00132         if ((L_pos + 1) <= (P_buffer+L_size_buffer)) { 
00133           L_ptr = L_pos + 1 ; 
00134         } else { 
00135           L_ptr = NULL ; 
00136         }
00137 
00138         L_size_end -= (L_size + 1) ;
00139 
00140         if (*L_new != '\r') {
00141           L_new += 1 ;
00142           *(L_new) = '\r' ;
00143         }
00144         L_new += 1 ;
00145         *(L_new) = '\n' ;
00146 
00147       } // while
00148 
00149         
00150       // ctrl the end of buffer
00151       if (L_size_end > 0) {
00152 
00153         L_size = L_size_end ;
00154         L_size_blank = 0 ;
00155 
00156         // skip blank
00157         if (L_skip_blank) {
00158 
00159           L_ptr = skip_blank(L_ptr,P_buffer, L_size_buffer, &L_size_blank) ;
00160           L_size -= L_size_blank ;
00161         }
00162 
00163         if (L_size) {
00164           L_new +=1 ;
00165 
00166           memcpy(L_new, L_ptr, L_size);
00167           L_new += (L_size-1) ;
00168         
00169           if (*L_new != '\r') {
00170             L_new += 1 ;
00171             *(L_new) = '\r' ;
00172           }
00173           L_new += 2 ;
00174           *L_new = '\0' ;
00175           *(L_new-1) = '\n' ;
00176         } else {
00177           // add final '\0' 
00178           L_new += 1 ;
00179           *L_new = '\0' ;
00180         }
00181       } else {
00182         // add final '\0' 
00183         L_new += 1 ;
00184         *L_new = '\0' ;
00185         
00186       }
00187     }
00188   }
00189 
00190   if (L_result != NULL) {
00191     L_ptr = L_result ;
00192     while ((L_ptr = strstr(L_ptr, "\r\n\r\n")) != NULL ) {
00193       memmove(L_ptr+2, L_ptr+4, strlen(L_ptr+4));
00194       L_ptr += 2 ;
00195     }
00196   }
00197 
00198   return (L_result);
00199 }
00200 

Generated on Wed Mar 7 14:44:59 2007 for Seagull by doxygen1.2.14 written by Dimitri van Heesch, © 1997-2002