view src/scanner.cpp @ 16:2ae8d953f1d0

add scanning for bare hostnames
author carl
date Thu, 29 Apr 2004 21:56:22 -0700
parents 6ac6d6b822ce
children b6a4b72bb96e
line wrap: on
line source

static char* scanner_version="$Id$";

using namespace std;

enum state {// host name recognizer states
            h_init,
            h_host,

            // html tag discarder states
            t_init,
            t_disc,

            // url recognizer states
            u_init,
            u_http,
            u_sla,
            u_url,

            // html entity decoder states
            e_init,
            e_amp,
            e_num,

            // mime decoder states
            m_init,
            m_eq,
            m_1,

            // base64 decoder states
            b_init,
            b_lf,
            b_lf2,
            b_64,

            // counter for number of columns in the table
            end_state,

            // temporary mime states
            h_end,
            t_end,
            u_reco,
            e_semi,
            m_2,
            m_cr,
            m_nl,
            b_cr,
           };

typedef state PARSE[end_state];

static PARSE parse_table[256] = {
  // h_init, h_host, t_init, t_disc, u_init, u_http, u_sla , u_url,  e_init, e_amp,  e_num,  m_init, m_eq,   m_1,    b_init, b_lf,   b_lf2,  b_64

    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x00
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x01
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x02
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x03
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x04
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x05
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x06
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x07
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x08
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x09 <tab>
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_nl,   m_init, b_lf,   b_init, b_lf2,  b_init,  },  // 0x0a <lf>
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x0b
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x0c
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_cr,   m_init, b_init, b_init, b_init, b_cr,    },  // 0x0d <cr>
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x0e
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x0f
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x10
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x11 xon char
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x12
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x13 xoff char
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x14
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x15
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x16
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x17
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x18
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x19
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x1a
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x1b
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x1c
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x1d
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x1e
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x1f
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x20 space
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x21 !
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x22 ""
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_num,  e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x23 #
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x24 $
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x25 %
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_amp,  e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x26 &
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x27 '
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x28 (
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x29 )
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x2A *
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_64,   b_64,   b_64,    },  // 0x2B +
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x2C ,
    {h_host, h_host, t_init, t_disc, u_init, u_init, u_url,  u_url,  e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x2D -
    {h_host, h_host, t_init, t_disc, u_init, u_init, u_url,  u_url,  e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x2E .
    {h_init, h_end,  t_init, t_disc, u_init, u_sla,  u_sla,  u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_64,   b_64,   b_64,    },  // 0x2F /
    {h_host, h_host, t_init, t_disc, u_init, u_init, u_url,  u_url,  e_init, e_init, e_num,  m_init, m_1,    m_2,    b_init, b_64,   b_64,   b_64,    },  // 0x30 0
    {h_host, h_host, t_init, t_disc, u_init, u_init, u_url,  u_url,  e_init, e_init, e_num,  m_init, m_1,    m_2,    b_init, b_64,   b_64,   b_64,    },  // 0x31 1
    {h_host, h_host, t_init, t_disc, u_init, u_init, u_url,  u_url,  e_init, e_init, e_num,  m_init, m_1,    m_2,    b_init, b_64,   b_64,   b_64,    },  // 0x32 2
    {h_host, h_host, t_init, t_disc, u_init, u_init, u_url,  u_url,  e_init, e_init, e_num,  m_init, m_1,    m_2,    b_init, b_64,   b_64,   b_64,    },  // 0x33 3
    {h_host, h_host, t_init, t_disc, u_init, u_init, u_url,  u_url,  e_init, e_init, e_num,  m_init, m_1,    m_2,    b_init, b_64,   b_64,   b_64,    },  // 0x34 4
    {h_host, h_host, t_init, t_disc, u_init, u_init, u_url,  u_url,  e_init, e_init, e_num,  m_init, m_1,    m_2,    b_init, b_64,   b_64,   b_64,    },  // 0x35 5
    {h_host, h_host, t_init, t_disc, u_init, u_init, u_url,  u_url,  e_init, e_init, e_num,  m_init, m_1,    m_2,    b_init, b_64,   b_64,   b_64,    },  // 0x36 6
    {h_host, h_host, t_init, t_disc, u_init, u_init, u_url,  u_url,  e_init, e_init, e_num,  m_init, m_1,    m_2,    b_init, b_64,   b_64,   b_64,    },  // 0x37 7
    {h_host, h_host, t_init, t_disc, u_init, u_init, u_url,  u_url,  e_init, e_init, e_num,  m_init, m_1,    m_2,    b_init, b_64,   b_64,   b_64,    },  // 0x38 8
    {h_host, h_host, t_init, t_disc, u_init, u_init, u_url,  u_url,  e_init, e_init, e_num,  m_init, m_1,    m_2,    b_init, b_64,   b_64,   b_64,    },  // 0x39 9
    {h_init, h_end,  t_init, t_disc, u_http, u_http, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x3A :
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_semi, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x3B ;
    {h_init, h_end,  t_disc, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x3C <
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_eq,   m_init, m_init, b_init, b_64,   b_64,   b_64,    },  // 0x3D =
    {h_init, h_end,  t_init, t_end,  u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x3E >
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x3F ?
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x40 @
    {h_host, h_host, t_init, t_disc, u_init, u_init, u_url,  u_url,  e_init, e_init, e_init, m_init, m_1,    m_2,    b_init, b_64,   b_64,   b_64,    },  // 0x41 A
    {h_host, h_host, t_init, t_disc, u_init, u_init, u_url,  u_url,  e_init, e_init, e_init, m_init, m_1,    m_2,    b_init, b_64,   b_64,   b_64,    },  // 0x42 B
    {h_host, h_host, t_init, t_disc, u_init, u_init, u_url,  u_url,  e_init, e_init, e_init, m_init, m_1,    m_2,    b_init, b_64,   b_64,   b_64,    },  // 0x43 C
    {h_host, h_host, t_init, t_disc, u_init, u_init, u_url,  u_url,  e_init, e_init, e_init, m_init, m_1,    m_2,    b_init, b_64,   b_64,   b_64,    },  // 0x44 D
    {h_host, h_host, t_init, t_disc, u_init, u_init, u_url,  u_url,  e_init, e_init, e_init, m_init, m_1,    m_2,    b_init, b_64,   b_64,   b_64,    },  // 0x45 E
    {h_host, h_host, t_init, t_disc, u_init, u_init, u_url,  u_url,  e_init, e_init, e_init, m_init, m_1,    m_2,    b_init, b_64,   b_64,   b_64,    },  // 0x46 F
    {h_host, h_host, t_init, t_disc, u_init, u_init, u_url,  u_url,  e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_64,   b_64,   b_64,    },  // 0x47 G
    {h_host, h_host, t_init, t_disc, u_http, u_http, u_url,  u_url,  e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_64,   b_64,   b_64,    },  // 0x48 H
    {h_host, h_host, t_init, t_disc, u_init, u_init, u_url,  u_url,  e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_64,   b_64,   b_64,    },  // 0x49 I
    {h_host, h_host, t_init, t_disc, u_init, u_init, u_url,  u_url,  e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_64,   b_64,   b_64,    },  // 0x4A J
    {h_host, h_host, t_init, t_disc, u_init, u_init, u_url,  u_url,  e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_64,   b_64,   b_64,    },  // 0x4B K
    {h_host, h_host, t_init, t_disc, u_init, u_init, u_url,  u_url,  e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_64,   b_64,   b_64,    },  // 0x4C L
    {h_host, h_host, t_init, t_disc, u_init, u_init, u_url,  u_url,  e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_64,   b_64,   b_64,    },  // 0x4D M
    {h_host, h_host, t_init, t_disc, u_init, u_init, u_url,  u_url,  e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_64,   b_64,   b_64,    },  // 0x4E N
    {h_host, h_host, t_init, t_disc, u_init, u_init, u_url,  u_url,  e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_64,   b_64,   b_64,    },  // 0x4F O
    {h_host, h_host, t_init, t_disc, u_http, u_http, u_url,  u_url,  e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_64,   b_64,   b_64,    },  // 0x50 P
    {h_host, h_host, t_init, t_disc, u_init, u_init, u_url,  u_url,  e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_64,   b_64,   b_64,    },  // 0x51 Q
    {h_host, h_host, t_init, t_disc, u_init, u_init, u_url,  u_url,  e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_64,   b_64,   b_64,    },  // 0x52 R
    {h_host, h_host, t_init, t_disc, u_init, u_init, u_url,  u_url,  e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_64,   b_64,   b_64,    },  // 0x53 S
    {h_host, h_host, t_init, t_disc, u_http, u_http, u_url,  u_url,  e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_64,   b_64,   b_64,    },  // 0x54 T
    {h_host, h_host, t_init, t_disc, u_init, u_init, u_url,  u_url,  e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_64,   b_64,   b_64,    },  // 0x55 U
    {h_host, h_host, t_init, t_disc, u_init, u_init, u_url,  u_url,  e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_64,   b_64,   b_64,    },  // 0x56 V
    {h_host, h_host, t_init, t_disc, u_init, u_init, u_url,  u_url,  e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_64,   b_64,   b_64,    },  // 0x57 W
    {h_host, h_host, t_init, t_disc, u_init, u_init, u_url,  u_url,  e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_64,   b_64,   b_64,    },  // 0x58 X
    {h_host, h_host, t_init, t_disc, u_init, u_init, u_url,  u_url,  e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_64,   b_64,   b_64,    },  // 0x59 Y
    {h_host, h_host, t_init, t_disc, u_init, u_init, u_url,  u_url,  e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_64,   b_64,   b_64,    },  // 0x5A Z
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x5B [
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x5C brace
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x5D ]
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x5E ^
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x5F _
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x60 `
    {h_host, h_host, t_init, t_disc, u_init, u_init, u_url,  u_url,  e_init, e_init, e_init, m_init, m_1,    m_2,    b_init, b_64,   b_64,   b_64,    },  // 0x61 a
    {h_host, h_host, t_init, t_disc, u_init, u_init, u_url,  u_url,  e_init, e_init, e_init, m_init, m_1,    m_2,    b_init, b_64,   b_64,   b_64,    },  // 0x62 b
    {h_host, h_host, t_init, t_disc, u_init, u_init, u_url,  u_url,  e_init, e_init, e_init, m_init, m_1,    m_2,    b_init, b_64,   b_64,   b_64,    },  // 0x63 c
    {h_host, h_host, t_init, t_disc, u_init, u_init, u_url,  u_url,  e_init, e_init, e_init, m_init, m_1,    m_2,    b_init, b_64,   b_64,   b_64,    },  // 0x64 d
    {h_host, h_host, t_init, t_disc, u_init, u_init, u_url,  u_url,  e_init, e_init, e_init, m_init, m_1,    m_2,    b_init, b_64,   b_64,   b_64,    },  // 0x65 e
    {h_host, h_host, t_init, t_disc, u_init, u_init, u_url,  u_url,  e_init, e_init, e_init, m_init, m_1,    m_2,    b_init, b_64,   b_64,   b_64,    },  // 0x66 f
    {h_host, h_host, t_init, t_disc, u_init, u_init, u_url,  u_url,  e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_64,   b_64,   b_64,    },  // 0x67 g
    {h_host, h_host, t_init, t_disc, u_http, u_http, u_url,  u_url,  e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_64,   b_64,   b_64,    },  // 0x68 h
    {h_host, h_host, t_init, t_disc, u_init, u_init, u_url,  u_url,  e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_64,   b_64,   b_64,    },  // 0x69 i
    {h_host, h_host, t_init, t_disc, u_init, u_init, u_url,  u_url,  e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_64,   b_64,   b_64,    },  // 0x6A j
    {h_host, h_host, t_init, t_disc, u_init, u_init, u_url,  u_url,  e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_64,   b_64,   b_64,    },  // 0x6B k
    {h_host, h_host, t_init, t_disc, u_init, u_init, u_url,  u_url,  e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_64,   b_64,   b_64,    },  // 0x6C l
    {h_host, h_host, t_init, t_disc, u_init, u_init, u_url,  u_url,  e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_64,   b_64,   b_64,    },  // 0x6D m
    {h_host, h_host, t_init, t_disc, u_init, u_init, u_url,  u_url,  e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_64,   b_64,   b_64,    },  // 0x6E n
    {h_host, h_host, t_init, t_disc, u_init, u_init, u_url,  u_url,  e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_64,   b_64,   b_64,    },  // 0x6F o
    {h_host, h_host, t_init, t_disc, u_http, u_http, u_url,  u_url,  e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_64,   b_64,   b_64,    },  // 0x70 p
    {h_host, h_host, t_init, t_disc, u_init, u_init, u_url,  u_url,  e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_64,   b_64,   b_64,    },  // 0x71 q
    {h_host, h_host, t_init, t_disc, u_init, u_init, u_url,  u_url,  e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_64,   b_64,   b_64,    },  // 0x72 r
    {h_host, h_host, t_init, t_disc, u_init, u_init, u_url,  u_url,  e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_64,   b_64,   b_64,    },  // 0x73 s
    {h_host, h_host, t_init, t_disc, u_http, u_http, u_url,  u_url,  e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_64,   b_64,   b_64,    },  // 0x74 t
    {h_host, h_host, t_init, t_disc, u_init, u_init, u_url,  u_url,  e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_64,   b_64,   b_64,    },  // 0x75 u
    {h_host, h_host, t_init, t_disc, u_init, u_init, u_url,  u_url,  e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_64,   b_64,   b_64,    },  // 0x76 v
    {h_host, h_host, t_init, t_disc, u_init, u_init, u_url,  u_url,  e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_64,   b_64,   b_64,    },  // 0x77 w
    {h_host, h_host, t_init, t_disc, u_init, u_init, u_url,  u_url,  e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_64,   b_64,   b_64,    },  // 0x78 x
    {h_host, h_host, t_init, t_disc, u_init, u_init, u_url,  u_url,  e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_64,   b_64,   b_64,    },  // 0x79 y
    {h_host, h_host, t_init, t_disc, u_init, u_init, u_url,  u_url,  e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_64,   b_64,   b_64,    },  // 0x7A z
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x7B {
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x7C |
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x7D }
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x7E ~
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x7f
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x80
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x81
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x82
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x83
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x84
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x85
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x86
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x87
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x88
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x89
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x8a
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x8b
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x8c
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x8d
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x8e
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x8f
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x90
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x91
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x92
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x93
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x94
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x95
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x96
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x97
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x98
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x99
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x9a
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x9b
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x9c
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x9d
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x9e
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0x9f
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xa0
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xa1
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xa2
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xa3
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xa4
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xa5
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xa6
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xa7
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xa8
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xa9
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xaa
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xab
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xac
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xad
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xae
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xaf
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xb0
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xb1
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xb2
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xb3
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xb4
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xb5
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xb6
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xb7
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xb8
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xb9
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xba
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xbb
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xbc
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xbd
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xbe
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xbf
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xc0
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xc1
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xc2
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xc3
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xc4
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xc5
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xc6
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xc7
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xc8
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xc9
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xca
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xcb
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xcc
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xcd
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xce
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xcf
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xd0
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xd1
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xd2
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xd3
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xd4
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xd5
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xd6
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xd7
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xd8
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xd9
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xda
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xdb
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xdc
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xdd
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xde
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xdf
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xe0
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xe1
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xe2
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xe3
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xe4
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xe5
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xe6
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xe7
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xe8
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xe9
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xea
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xeb
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xec
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xed
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xee
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xef
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xf0
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xf1
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xf2
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xf3
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xf4
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xf5
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xf6
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xf7
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xf8
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xf9
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xfa
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xfb
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xfc
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xfd
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xfe
    {h_init, h_end,  t_init, t_disc, u_init, u_init, u_init, u_reco, e_init, e_init, e_init, m_init, m_init, m_init, b_init, b_init, b_init, b_init,  },  // 0xff
};


char *tlds[] = {
    ".com",
    ".net",
    ".org",
    ".biz",
    NULL
};

u_char hex_decode[256] = {
    0,  // 0x00
    0,  // 0x01
    0,  // 0x02
    0,  // 0x03
    0,  // 0x04
    0,  // 0x05
    0,  // 0x06
    0,  // 0x07
    0,  // 0x08
    0,  // 0x09 <tab>
    0,  // 0x0a <lf>
    0,  // 0x0b
    0,  // 0x0c
    0,  // 0x0d <cr>
    0,  // 0x0e
    0,  // 0x0f
    0,  // 0x10
    0,  // 0x11 xon char
    0,  // 0x12
    0,  // 0x13 xoff char
    0,  // 0x14
    0,  // 0x15
    0,  // 0x16
    0,  // 0x17
    0,  // 0x18
    0,  // 0x19
    0,  // 0x1a
    0,  // 0x1b
    0,  // 0x1c
    0,  // 0x1d
    0,  // 0x1e
    0,  // 0x1f
    0,  // 0x20 space
    0,  // 0x21 !
    0,  // 0x22 ""
    0,  // 0x23 #
    0,  // 0x24 $
    0,  // 0x25 %
    0,  // 0x26 &
    0,  // 0x27 '
    0,  // 0x28 (
    0,  // 0x29 )
    0,  // 0x2A *
    0,  // 0x2B +
    0,  // 0x2C ,
    0,  // 0x2D -
    0,  // 0x2E .
    0,  // 0x2F /
    0,  // 0x30 0
    1,  // 0x31 1
    2,  // 0x32 2
    3,  // 0x33 3
    4,  // 0x34 4
    5,  // 0x35 5
    6,  // 0x36 6
    7,  // 0x37 7
    8,  // 0x38 8
    9,  // 0x39 9
    0,  // 0x3A :
    0,  // 0x3B ;
    0,  // 0x3C <
    0,  // 0x3D =
    0,  // 0x3E >
    0,  // 0x3F ?
    0,  // 0x40 @
    10, // 0x41 A
    11, // 0x42 B
    12, // 0x43 C
    13, // 0x44 D
    14, // 0x45 E
    15, // 0x46 F
    0,  // 0x47 G
    0,  // 0x48 H
    0,  // 0x49 I
    0,  // 0x4A J
    0,  // 0x4B K
    0,  // 0x4C L
    0,  // 0x4D M
    0,  // 0x4E N
    0,  // 0x4F O
    0,  // 0x50 P
    0,  // 0x51 Q
    0,  // 0x52 R
    0,  // 0x53 S
    0,  // 0x54 T
    0,  // 0x55 U
    0,  // 0x56 V
    0,  // 0x57 W
    0,  // 0x58 X
    0,  // 0x59 Y
    0,  // 0x5A Z
    0,  // 0x5B [
    0,  // 0x5C brace
    0,  // 0x5D ]
    0,  // 0x5E ^
    0,  // 0x5F _
    0,  // 0x60 `
    10, // 0x61 a
    11, // 0x62 b
    12, // 0x63 c
    13, // 0x64 d
    14, // 0x65 e
    15, // 0x66 f
    0,  // 0x67 g
    0,  // 0x68 h
    0,  // 0x69 i
    0,  // 0x6A j
    0,  // 0x6B k
    0,  // 0x6C l
    0,  // 0x6D m
    0,  // 0x6E n
    0,  // 0x6F o
    0,  // 0x70 p
    0,  // 0x71 q
    0,  // 0x72 r
    0,  // 0x73 s
    0,  // 0x74 t
    0,  // 0x75 u
    0,  // 0x76 v
    0,  // 0x77 w
    0,  // 0x78 x
    0,  // 0x79 y
    0,  // 0x7A z
    0,  // 0x7B {
    0,  // 0x7C |
    0,  // 0x7D }
    0,  // 0x7E ~
    0,  // 0x7f
    0,  // 0x80
    0,  // 0x81
    0,  // 0x82
    0,  // 0x83
    0,  // 0x84
    0,  // 0x85
    0,  // 0x86
    0,  // 0x87
    0,  // 0x88
    0,  // 0x89
    0,  // 0x8a
    0,  // 0x8b
    0,  // 0x8c
    0,  // 0x8d
    0,  // 0x8e
    0,  // 0x8f
    0,  // 0x90
    0,  // 0x91
    0,  // 0x92
    0,  // 0x93
    0,  // 0x94
    0,  // 0x95
    0,  // 0x96
    0,  // 0x97
    0,  // 0x98
    0,  // 0x99
    0,  // 0x9a
    0,  // 0x9b
    0,  // 0x9c
    0,  // 0x9d
    0,  // 0x9e
    0,  // 0x9f
    0,  // 0xa0
    0,  // 0xa1
    0,  // 0xa2
    0,  // 0xa3
    0,  // 0xa4
    0,  // 0xa5
    0,  // 0xa6
    0,  // 0xa7
    0,  // 0xa8
    0,  // 0xa9
    0,  // 0xaa
    0,  // 0xab
    0,  // 0xac
    0,  // 0xad
    0,  // 0xae
    0,  // 0xaf
    0,  // 0xb0
    0,  // 0xb1
    0,  // 0xb2
    0,  // 0xb3
    0,  // 0xb4
    0,  // 0xb5
    0,  // 0xb6
    0,  // 0xb7
    0,  // 0xb8
    0,  // 0xb9
    0,  // 0xba
    0,  // 0xbb
    0,  // 0xbc
    0,  // 0xbd
    0,  // 0xbe
    0,  // 0xbf
    0,  // 0xc0
    0,  // 0xc1
    0,  // 0xc2
    0,  // 0xc3
    0,  // 0xc4
    0,  // 0xc5
    0,  // 0xc6
    0,  // 0xc7
    0,  // 0xc8
    0,  // 0xc9
    0,  // 0xca
    0,  // 0xcb
    0,  // 0xcc
    0,  // 0xcd
    0,  // 0xce
    0,  // 0xcf
    0,  // 0xd0
    0,  // 0xd1
    0,  // 0xd2
    0,  // 0xd3
    0,  // 0xd4
    0,  // 0xd5
    0,  // 0xd6
    0,  // 0xd7
    0,  // 0xd8
    0,  // 0xd9
    0,  // 0xda
    0,  // 0xdb
    0,  // 0xdc
    0,  // 0xdd
    0,  // 0xde
    0,  // 0xdf
    0,  // 0xe0
    0,  // 0xe1
    0,  // 0xe2
    0,  // 0xe3
    0,  // 0xe4
    0,  // 0xe5
    0,  // 0xe6
    0,  // 0xe7
    0,  // 0xe8
    0,  // 0xe9
    0,  // 0xea
    0,  // 0xeb
    0,  // 0xec
    0,  // 0xed
    0,  // 0xee
    0,  // 0xef
    0,  // 0xf0
    0,  // 0xf1
    0,  // 0xf2
    0,  // 0xf3
    0,  // 0xf4
    0,  // 0xf5
    0,  // 0xf6
    0,  // 0xf7
    0,  // 0xf8
    0,  // 0xf9
    0,  // 0xfa
    0,  // 0xfb
    0,  // 0xfc
    0,  // 0xfd
    0,  // 0xfe
    0,  // 0xff
};

u_char b64_decode[256] = {
    0,  // 0x00
    0,  // 0x01
    0,  // 0x02
    0,  // 0x03
    0,  // 0x04
    0,  // 0x05
    0,  // 0x06
    0,  // 0x07
    0,  // 0x08
    0,  // 0x09 <tab>
    0,  // 0x0a <lf>
    0,  // 0x0b
    0,  // 0x0c
    0,  // 0x0d <cr>
    0,  // 0x0e
    0,  // 0x0f
    0,  // 0x10
    0,  // 0x11 xon char
    0,  // 0x12
    0,  // 0x13 xoff char
    0,  // 0x14
    0,  // 0x15
    0,  // 0x16
    0,  // 0x17
    0,  // 0x18
    0,  // 0x19
    0,  // 0x1a
    0,  // 0x1b
    0,  // 0x1c
    0,  // 0x1d
    0,  // 0x1e
    0,  // 0x1f
    0,  // 0x20 space
    0,  // 0x21 !
    0,  // 0x22 ""
    0,  // 0x23 #
    0,  // 0x24 $
    0,  // 0x25 %
    0,  // 0x26 &
    0,  // 0x27 '
    0,  // 0x28 (
    0,  // 0x29 )
    0,  // 0x2A *
    62, // 0x2B +
    0,  // 0x2C ,
    0,  // 0x2D -
    0,  // 0x2E .
    63, // 0x2F /
    52, // 0x30 0
    53, // 0x31 1
    54, // 0x32 2
    55, // 0x33 3
    56, // 0x34 4
    57, // 0x35 5
    58, // 0x36 6
    59, // 0x37 7
    60, // 0x38 8
    61, // 0x39 9
    0,  // 0x3A :
    0,  // 0x3B ;
    0,  // 0x3C <
    0,  // 0x3D =
    0,  // 0x3E >
    0,  // 0x3F ?
    0,  // 0x40 @
    0,  // 0x41 A
    1,  // 0x42 B
    2,  // 0x43 C
    3,  // 0x44 D
    4,  // 0x45 E
    5,  // 0x46 F
    6,  // 0x47 G
    7,  // 0x48 H
    8,  // 0x49 I
    9,  // 0x4A J
    10, // 0x4B K
    11, // 0x4C L
    12, // 0x4D M
    13, // 0x4E N
    14, // 0x4F O
    15, // 0x50 P
    16, // 0x51 Q
    17, // 0x52 R
    18, // 0x53 S
    19, // 0x54 T
    20, // 0x55 U
    21, // 0x56 V
    22, // 0x57 W
    23, // 0x58 X
    24, // 0x59 Y
    25, // 0x5A Z
    0,  // 0x5B [
    0,  // 0x5C brace
    0,  // 0x5D ]
    0,  // 0x5E ^
    0,  // 0x5F _
    0,  // 0x60 `
    26, // 0x61 a
    27, // 0x62 b
    28, // 0x63 c
    29, // 0x64 d
    30, // 0x65 e
    31, // 0x66 f
    32, // 0x67 g
    33, // 0x68 h
    34, // 0x69 i
    35, // 0x6A j
    36, // 0x6B k
    37, // 0x6C l
    38, // 0x6D m
    39, // 0x6E n
    40, // 0x6F o
    41, // 0x70 p
    42, // 0x71 q
    43, // 0x72 r
    44, // 0x73 s
    45, // 0x74 t
    46, // 0x75 u
    47, // 0x76 v
    48, // 0x77 w
    49, // 0x78 x
    50, // 0x79 y
    51, // 0x7A z
    0,  // 0x7B {
    0,  // 0x7C |
    0,  // 0x7D }
    0,  // 0x7E ~
    0,  // 0x7f
    0,  // 0x80
    0,  // 0x81
    0,  // 0x82
    0,  // 0x83
    0,  // 0x84
    0,  // 0x85
    0,  // 0x86
    0,  // 0x87
    0,  // 0x88
    0,  // 0x89
    0,  // 0x8a
    0,  // 0x8b
    0,  // 0x8c
    0,  // 0x8d
    0,  // 0x8e
    0,  // 0x8f
    0,  // 0x90
    0,  // 0x91
    0,  // 0x92
    0,  // 0x93
    0,  // 0x94
    0,  // 0x95
    0,  // 0x96
    0,  // 0x97
    0,  // 0x98
    0,  // 0x99
    0,  // 0x9a
    0,  // 0x9b
    0,  // 0x9c
    0,  // 0x9d
    0,  // 0x9e
    0,  // 0x9f
    0,  // 0xa0
    0,  // 0xa1
    0,  // 0xa2
    0,  // 0xa3
    0,  // 0xa4
    0,  // 0xa5
    0,  // 0xa6
    0,  // 0xa7
    0,  // 0xa8
    0,  // 0xa9
    0,  // 0xaa
    0,  // 0xab
    0,  // 0xac
    0,  // 0xad
    0,  // 0xae
    0,  // 0xaf
    0,  // 0xb0
    0,  // 0xb1
    0,  // 0xb2
    0,  // 0xb3
    0,  // 0xb4
    0,  // 0xb5
    0,  // 0xb6
    0,  // 0xb7
    0,  // 0xb8
    0,  // 0xb9
    0,  // 0xba
    0,  // 0xbb
    0,  // 0xbc
    0,  // 0xbd
    0,  // 0xbe
    0,  // 0xbf
    0,  // 0xc0
    0,  // 0xc1
    0,  // 0xc2
    0,  // 0xc3
    0,  // 0xc4
    0,  // 0xc5
    0,  // 0xc6
    0,  // 0xc7
    0,  // 0xc8
    0,  // 0xc9
    0,  // 0xca
    0,  // 0xcb
    0,  // 0xcc
    0,  // 0xcd
    0,  // 0xce
    0,  // 0xcf
    0,  // 0xd0
    0,  // 0xd1
    0,  // 0xd2
    0,  // 0xd3
    0,  // 0xd4
    0,  // 0xd5
    0,  // 0xd6
    0,  // 0xd7
    0,  // 0xd8
    0,  // 0xd9
    0,  // 0xda
    0,  // 0xdb
    0,  // 0xdc
    0,  // 0xdd
    0,  // 0xde
    0,  // 0xdf
    0,  // 0xe0
    0,  // 0xe1
    0,  // 0xe2
    0,  // 0xe3
    0,  // 0xe4
    0,  // 0xe5
    0,  // 0xe6
    0,  // 0xe7
    0,  // 0xe8
    0,  // 0xe9
    0,  // 0xea
    0,  // 0xeb
    0,  // 0xec
    0,  // 0xed
    0,  // 0xee
    0,  // 0xef
    0,  // 0xf0
    0,  // 0xf1
    0,  // 0xf2
    0,  // 0xf3
    0,  // 0xf4
    0,  // 0xf5
    0,  // 0xf6
    0,  // 0xf7
    0,  // 0xf8
    0,  // 0xf9
    0,  // 0xfa
    0,  // 0xfb
    0,  // 0xfc
    0,  // 0xfd
    0,  // 0xfe
    0,  // 0xff
};

#define PENDING_LIMIT 100
struct fsa {
    u_char      pending[PENDING_LIMIT];
    int         count;
    state       st;
    state       init;
    fsa*        next1;
    fsa*        next2;
    string_set  *hosts;

    fsa(state init, fsa* next1_, fsa* next2_, string_set *hosts_);
    void push(u_char *buf, int len);
    void pusher();
};

fsa::fsa(state init_, fsa *next1_, fsa *next2_, string_set *hosts_) {
    count = 0;
    st    = init_;
    init  = init_;
    next1 = next1_;
    next2 = next2_;
    hosts = hosts_;
}

void fsa::pusher() {
    if (next1) next1->push(pending, count);
    if (next2) next2->push(pending, count);
    count = 0;
}

void fsa::push(u_char *buf, int len) {
    for (int i=0; i<len; i++) {
        u_char c = buf[i];
        // guard against buffer overflow
        if (count == (PENDING_LIMIT-1)) {
            pusher();
            st = init;
        }
        pending[count++] = c;
        st = parse_table[c][st];
        switch (st) {

            //////////////////////////////
            //  host name recognizer
            case h_end: {
                count--;
                char *tld;
                for (int i=0; (tld = tlds[i]); i++) {
                    int n = strlen(tld);
                    if (count > n) {
                        if (strncasecmp((const char *)(pending+count-n), tld, n) == 0) {
                            register_string(*hosts, (char*)pending);
                        }
                    }
                }
                } // fall thru

            case h_init: {
                    count = 0;
                } break;

            //////////////////////////////
            //  html tag { discarder
            case t_end:
                st = t_init;
                // fall thru

            case t_disc: {
                    count = 0;
                } break;

            case t_init: {
                pusher();
                } break;

            //////////////////////////////
            //  url recognizer
            case u_sla: {
                if ((count < 6) || (7 < count)) {
                    count = 0;
                    st    = u_init;
                }
                } break;

            case u_reco: {
                if (count > 12) {
                    pending[count-1] = 0;
                    if (strncasecmp((const char *)pending, "http://", 7) == 0) {
                        char *p = (char *)pending + 7;
                        if (strchr(p, '.')) register_string(*hosts, p); // require at least one . in a dns name
                    }
                }
                } // fall thru

            case u_init: {
                count = 0;  // discard all characters
                } break;


            //////////////////////////////
            //  html entity decoder
            case e_semi: {
                pending[--count] = '\0';  // null terminate the digit string by overwriting the semicolon
                pending[0] = atoi((const char *)pending+2);
                count = 1;
                st    = e_init;
                } // fall thru

            case e_init: {
                pusher();
                } break;

            //////////////////////////////
            //  mime decoder
            case m_2: {
                pending[0] = hex_decode[pending[1]] * 16 + hex_decode[pending[2]];
                count = 1;
                st    = m_init;
                } // fall thru

            case m_init: {
                pusher();
                } break;

            case m_cr: {
                count = 1;
                st    = m_eq;
                } break;

            case m_nl: {
                count = 0;
                st    = m_init;
                } break;

            //////////////////////////////
            //  base64 decoder
            case b_lf2: {
                count--;
                } break;

            case b_cr: {
                int cnt = 0;
                if ((count % 4) == 1) {
                    count--;
                    // might have proper b64 data
                    for (int i=0; i<count; i+=4) {
                        unsigned long a1 = b64_decode[pending[i]];
                        unsigned long a2 = b64_decode[pending[i+1]];
                        unsigned long a3 = b64_decode[pending[i+2]];
                        unsigned long a4 = b64_decode[pending[i+3]];
                        unsigned long a = (a1 << 18) | (a2 << 12) | (a3 << 6) | a4;
                        pending[cnt++] = (a & 0x00ff0000) >> 16;
                        pending[cnt++] = (a & 0x0000ff00) >>  8;
                        pending[cnt++] = (a & 0x000000ff);
                        if ((char)pending[i+3] == '=') cnt--;
                        if ((char)pending[i+2] == '=') cnt--;
                    }
                    count = cnt;
                    st    = b_lf2;
                }
                else st = b_init;
                } // fall thru

            case b_lf:
            case b_init: {
                pusher();
                } break;

            //////////////////////////////
            //  states that just accumulate characters in the pending buffer
            case h_host:
            case u_http:
            case u_url:
            case e_amp:
            case e_num:
            case b_64:
            case m_eq:
            case m_1:
            default: {
                } break;
        }
    }
}

struct url_scanner {
    fsa *host_parser;
    fsa *tags_parser;
    fsa *urls_parser;
    fsa *html_parser;
    fsa *mime_parser;
    fsa *b64_parser;

    url_scanner(string_set *hosts);
    ~url_scanner();
    void scan(u_char *buffer, size_t length);
};

url_scanner::url_scanner(string_set *hosts) {
    host_parser = new fsa(h_init, NULL,        NULL,        hosts);
    tags_parser = new fsa(t_init, host_parser, NULL,        NULL);
    urls_parser = new fsa(u_init, NULL,        NULL,        hosts);
    html_parser = new fsa(e_init, urls_parser, tags_parser, NULL);
    mime_parser = new fsa(m_init, html_parser, NULL,        NULL);
    b64_parser  = new fsa(b_init, mime_parser, NULL,        NULL);
}

url_scanner::~url_scanner() {
    delete host_parser;
    delete tags_parser;
    delete urls_parser;
    delete html_parser;
    delete mime_parser;
    delete b64_parser;
}

void url_scanner::scan(u_char *buffer, size_t length) {
    b64_parser->push(buffer, length);
}