aboutsummaryrefslogblamecommitdiffstats
path: root/library/cpp/uri/encodefsm.rl6
blob: 6a323aa85a3ea81897d7080c2c300e082a62e887 (plain) (tree)
1
2
3
4
5
6
7
8
9
                                   
 


                                                        

                   
   
                     
 



                                  
 

                             
 



                                        
 

                                                                
 
               
   
                                              
 

                                      
           
                 

                  



                    
 
#include <library/cpp/uri/encode.h>

#ifdef __clang__
    #pragma clang diagnostic ignored "-Wunused-variable"
#endif

namespace NUri {
namespace NEncode {

%%{
    machine TEncoder;

    hex = (
        digit >{ HexDigit(fc); } |
        [A-F] >{ HexUpper(fc); } |
        [a-f] >{ HexLower(fc); }
    );

    escaped = ( "%" hex hex )
            > { HexReset(); }
            % { DoHex(); };

    bad_escaped = ( "%" hex )
                % {
                      DoSym(*(fpc - 2));
                      DoSym(*(fpc - 1));
                  };

    sym = (any - bad_escaped - escaped) %{ DoSym(*(fpc - 1)); };

    main := ( escaped | bad_escaped | sym )**;

    write data;
}%%

ui64 TEncoder::ReEncode(const TStringBuf &url)
{
    const char *p  = url.data();
    const char *pe = p + url.length();
    const char *eof = pe;
    int cs;
    OutFlags = 0;

    %% write init;
    %% write exec;

    return OutFlags;
}

}
}