| iMatix home page
| << | < | > | >>
SFL Logo SFL
Version 2.11

 

encode_meta_char

#include "sflhttp.h"
size_t
encode_meta_char (
    char  *output,
    char   code,
    size_t outmax,
    Bool   html)

Synopsis

Translates one character into HTML/SGML metacharacters. You supply an output buffer and specify the maximum size of this buffer. Returns the final size of the translated data excluding the final null byte. If the resulting data is too long, translation does not occur and the returned value is zero. If html is TRUE then the metacharacters cr, amp, lt, gt and quot are not translated - this allows you to encode accented characters within HTML; otherwise they are translated and the output doesn't look like HTML.

Source Code - (sflhttp.c)

{
    static char
        *meta [256];                    /*  Metacharacter translation table  */
    static Bool
        first_time = TRUE;              /*  First time flag                  */
    size_t
        length;                         /*  Length of translation            */
    char
        *meta_char,                     /*  Pointer through metachar string  */
        buffer [10];                    /*  Buffer for conversions           */

    /*  Initialise translation table first time through                      */
    if (first_time)
      {
        first_time = FALSE;
        memset (meta, 0, sizeof (meta));

#if (defined (__UNIX__) || defined (__WINDOWS__))
        /*  UNIX and Windows generally use ISO-8859-1 (Latin-1)              */
        meta [0x91] = "lsquo";
        meta [0x92] = "rsquo";
        meta [0xA1] = "iexcl";
        meta [0xA2] = "cent";
        meta [0xA3] = "pound";
        meta [0xA4] = "curren";
        meta [0xA5] = "yen";
        meta [0xA6] = "brvbar";
        meta [0xA7] = "sect";
        meta [0xA8] = "uml";
        meta [0xA9] = "copy";
        meta [0xAA] = "ordf";
        meta [0xAB] = "laquo";
        meta [0xAC] = "not";
        meta [0xAD] = "shy";
        meta [0xAE] = "reg";
        meta [0xAF] = "macr";
        meta [0xB0] = "deg";
        meta [0xB1] = "plusmn";
        meta [0xB2] = "sup2";
        meta [0xB3] = "sup3";
        meta [0xB4] = "acute";
        meta [0xB5] = "micro";
        meta [0xB6] = "para";
        meta [0xB7] = "middot";
        meta [0xB8] = "cedil";
        meta [0xB9] = "sup1";
        meta [0xBA] = "ordm";
        meta [0xBB] = "raquo";
        meta [0xBC] = "frac14";
        meta [0xBD] = "frac12";
        meta [0xBE] = "frac34";
        meta [0xBF] = "iquest";
        meta [0xC0] = "Agrave";
        meta [0xC1] = "Aacute";
        meta [0xC2] = "Acirc";
        meta [0xC3] = "Atilde";
        meta [0xC4] = "Auml";
        meta [0xC5] = "Aring";
        meta [0xC6] = "AElig";
        meta [0xC7] = "Ccedil";
        meta [0xC8] = "Egrave";
        meta [0xC9] = "Eacute";
        meta [0xCA] = "Ecirc";
        meta [0xCB] = "Euml";
        meta [0xCC] = "Igrave";
        meta [0xCD] = "Iacute";
        meta [0xCE] = "Icirc";
        meta [0xCF] = "Iuml";
        meta [0xD0] = "ETH";
        meta [0xD1] = "Ntilde";
        meta [0xD2] = "Ograve";
        meta [0xD3] = "Oacute";
        meta [0xD4] = "Ocirc";
        meta [0xD5] = "Otilde";
        meta [0xD6] = "Ouml";
        meta [0xD7] = "times";
        meta [0xD8] = "Oslash";
        meta [0xD9] = "Ugrave";
        meta [0xDA] = "Uacute";
        meta [0xDB] = "Ucirc";
        meta [0xDC] = "Uuml";
        meta [0xDD] = "Yacute";
        meta [0xDE] = "THORN";
        meta [0xDF] = "szlig";
        meta [0xE0] = "agrave";
        meta [0xE1] = "aacute";
        meta [0xE2] = "acirc";
        meta [0xE3] = "atilde";
        meta [0xE4] = "auml";
        meta [0xE5] = "aring";
        meta [0xE6] = "aelig";
        meta [0xE7] = "ccedil";
        meta [0xE8] = "egrave";
        meta [0xE9] = "eacute";
        meta [0xEA] = "ecirc";
        meta [0xEB] = "euml";
        meta [0xEC] = "igrave";
        meta [0xED] = "iacute";
        meta [0xEE] = "icirc";
        meta [0xEF] = "iuml";
        meta [0xF0] = "eth";
        meta [0xF1] = "ntilde";
        meta [0xF2] = "ograve";
        meta [0xF3] = "oacute";
        meta [0xF4] = "ocirc";
        meta [0xF5] = "otilde";
        meta [0xF6] = "ouml";
        meta [0xF7] = "divide";
        meta [0xF8] = "oslash";
        meta [0xF9] = "ugrave";
        meta [0xFA] = "uacute";
        meta [0xFB] = "ucirc";
        meta [0xFC] = "uuml";
        meta [0xFD] = "yacute";
        meta [0xFE] = "thorn";
        meta [0xFF] = "yuml";

#elif (defined (__MSDOS__))
        /*  DOS generally uses the PC-1 alphabet                             */
        meta [0x80] = "Ccedil";
        meta [0x81] = "uuml";
        meta [0x82] = "eacute";
        meta [0x83] = "acirc";
        meta [0x84] = "auml";
        meta [0x85] = "agrave";
        meta [0x86] = "aring";
        meta [0x87] = "ccedil";
        meta [0x88] = "ecirc";
        meta [0x89] = "euml";
        meta [0x8B] = "iuml";
        meta [0x8C] = "icirc";
        meta [0x8D] = "igrave";
        meta [0x8E] = "Auml";
        meta [0x8F] = "Aring";
        meta [0x90] = "Eacute";
        meta [0x91] = "aelig";
        meta [0x92] = "AElig";
        meta [0x93] = "ocirc";
        meta [0x94] = "ouml";
        meta [0x95] = "ograve";
        meta [0x96] = "ucirc";
        meta [0x97] = "ugrave";
        meta [0x98] = "yuml";
        meta [0x99] = "Ouml";
        meta [0x9A] = "Uuml";
        meta [0x9B] = "oslash";
        meta [0x9C] = "pound";
        meta [0x9D] = "Oslash";
        meta [0x9E] = "times";
        meta [0xA0] = "aacute";
        meta [0xA1] = "iacute";
        meta [0xA2] = "otilde";
        meta [0xA3] = "uacute";
        meta [0xA4] = "ntilde";
        meta [0xA5] = "Ntilde";
        meta [0xA6] = "ordf";
        meta [0xA7] = "ordm";
        meta [0xA8] = "iquest";
        meta [0xA9] = "reg";
        meta [0xAA] = "not";
        meta [0xAB] = "frac14";
        meta [0xAC] = "frac12";
        meta [0xAD] = "iexcl";
        meta [0xAE] = "laquo";
        meta [0xAF] = "raquo";
        meta [0xB0] = "shy";
        meta [0xB5] = "Aacute";
        meta [0xB6] = "Acirc";
        meta [0xB7] = "Agrave";
        meta [0xB8] = "copy";
        meta [0xC6] = "atilde";
        meta [0xC7] = "Atilde";
        meta [0xCA] = "egrave";
        meta [0xCF] = "curren";
        meta [0xD1] = "ETH";
        meta [0xD2] = "Ecirc";
        meta [0xD3] = "Euml";
        meta [0xD4] = "Egrave";
        meta [0xD6] = "Iacute";
        meta [0xD7] = "Icirc";
        meta [0xD8] = "Iuml";
        meta [0xDD] = "brvbar";
        meta [0xDE] = "Igrave";
        meta [0xE0] = "Oacute";
        meta [0xE1] = "szlig";
        meta [0xE2] = "Ocirc";
        meta [0xE3] = "Ograve";
        meta [0xE5] = "Otilde";
        meta [0xE6] = "THORN";
        meta [0xE9] = "Uacute";
        meta [0xEA] = "Ucirc";
        meta [0xEB] = "Ugrave";
        meta [0xEC] = "yacute";
        meta [0xED] = "Yacute";
        meta [0xEE] = "macr";
        meta [0xEF] = "acute";
        meta [0xF1] = "plusmn";
        meta [0xF3] = "frac34";
        meta [0xF4] = "para";
        meta [0xF5] = "sect";
        meta [0xF6] = "divide";
        meta [0xF8] = "deg";
        meta [0xFA] = "middot";
        meta [0xFB] = "sup1";
        meta [0xFC] = "sup3";
        meta [0xFD] = "sup2";
#endif
      }

    meta_char = meta [(int) code & 255];
    if (meta_char == 0)
      {
        if (html)
          {
            output [0] = code;
            return (1);
          }
        else
          {
            switch (code)
              {
                case  '&':
                    meta_char = "amp";
                    break;
                case  '<':
                    meta_char = "lt";
                    break;
                case  '>':
                    meta_char = "gt";
                    break;
                case  '"':
                    meta_char = "quot";
                    break;
                default:
                    output [0] = code;
                    return (1);
              }
          }
      }
    snprintf (buffer, sizeof (buffer), "&%s;", meta_char);
    length = strlen (buffer);
    if (length < outmax)
      {
        strncpy (output, buffer, outmax);
        return length;
      }
    else
      {
        output [0] = 0;
        return (0);
      }
}

| << | < | > | >> iMatix Copyright © 1996-2000 iMatix Corporation