📄 sflhttp.c
字号:
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);
}
}
/* ---------------------------------------------------------------------[<]-
Function: http_decode_meta
Synopsis: Translates special characters from HTML/SGML
metacharacters. The input buffer is not modified; you supply an
output buffer and specify the maximum size of this buffer. The input
buffer must end in a null. The two buffers may be the same, since
decoding reduces the size of the data. Returns the final size of the
translated data excluding the final null byte. If the resulting data
is too long, it is brutally truncated. Invalid meta-characters are
left as-is. Normally the input pointer points to the final null;
however if the input string runs out in the middle of a
meta-character, the input pointer is left pointing at the start of
that meta-character (the '&'). If the two buffers are the same, it
may be the case that this character has been overwritten with the
terminating null.
---------------------------------------------------------------------[>]-*/
size_t
http_decode_meta (
char *output,
char **input,
size_t outmax)
{
char
*dest, /* Pointer to result string */
*end, /* Next character after meta-char */
code; /* Decoded metachar string */
size_t
space_left; /* Space left in destination */
ASSERT (input);
ASSERT (*input);
ASSERT (output);
if (outmax == 0) /* Special case for zero space */
return (0);
space_left = outmax - 1; /* Allow for final null byte */
dest = output;
for (; **input; (*input)++)
{
if (**input == '&')
{
end = strchr (*input, ';');
if (end)
{
code = decode_meta_charn ((*input) + 1, end - (*input) - 1);
if (code)
*input = end; /* Skip past decoded metachar */
else
code = **input; /* Ignore the &, no valid metachar */
}
else /* The string ends before the ';' */
if (strlen (*input) > 10)
code = **input; /* Ignore the &, no valid metachar */
else
break;
}
else
code = **input;
if (space_left > 0)
{
*dest++ = code;
space_left --;
}
}
*dest = '\0';
return ((size_t) (dest - output));
}
/* ---------------------------------------------------------------------[<]-
Function: decode_meta_charn
Synopsis: Decodes a single meta-character (the piece from the character
after the '&' up to but not including the ';'. If the meta-character
is valid, returns the character; otherwise returns zero. Decodes both
named and numeric meta-characters. Use the macro decode_meta_char if
the input has a terminating zero.
---------------------------------------------------------------------[>]-*/
char
decode_meta_charn (const char *input, size_t length)
{
#define META_COUNT 102
static char
*meta [META_COUNT]; /* Metacharacter translation tables */
static byte
code [META_COUNT];
static Bool
first_time = TRUE; /* First time flag */
int
char_index, /* Index into translation table */
min, /* Pointers for binary chop */
max,
cmp,
num;
/* Initialise translation table first time through */
if (first_time)
{
first_time = FALSE;
/* The meta-characters must be in alphabetical order so we can use */
/* a binary chop. */
#if (defined (__UNIX__) || defined (__WINDOWS__))
/* UNIX and Windows generally use ISO-8859-1 (Latin-1) */
code [ 0] = 0xC6; meta [ 0] = "AElig";
code [ 1] = 0xC1; meta [ 1] = "Aacute";
code [ 2] = 0xC2; meta [ 2] = "Acirc";
code [ 3] = 0xC0; meta [ 3] = "Agrave";
code [ 4] = 0xC5; meta [ 4] = "Aring";
code [ 5] = 0xC3; meta [ 5] = "Atilde";
code [ 6] = 0xC4; meta [ 6] = "Auml";
code [ 7] = 0xC7; meta [ 7] = "Ccedil";
code [ 8] = 0xD0; meta [ 8] = "ETH";
code [ 9] = 0xC9; meta [ 9] = "Eacute";
code [ 10] = 0xCA; meta [ 10] = "Ecirc";
code [ 11] = 0xC8; meta [ 11] = "Egrave";
code [ 12] = 0xCB; meta [ 12] = "Euml";
code [ 13] = 0xCD; meta [ 13] = "Iacute";
code [ 14] = 0xCE; meta [ 14] = "Icirc";
code [ 15] = 0xCC; meta [ 15] = "Igrave";
code [ 16] = 0xCF; meta [ 16] = "Iuml";
code [ 17] = 0xD1; meta [ 17] = "Ntilde";
code [ 18] = 0xD3; meta [ 18] = "Oacute";
code [ 19] = 0xD4; meta [ 19] = "Ocirc";
code [ 20] = 0xD2; meta [ 20] = "Ograve";
code [ 21] = 0xD8; meta [ 21] = "Oslash";
code [ 22] = 0xD5; meta [ 22] = "Otilde";
code [ 23] = 0xD6; meta [ 23] = "Ouml";
code [ 24] = 0xDE; meta [ 24] = "THORN";
code [ 25] = 0xDA; meta [ 25] = "Uacute";
code [ 26] = 0xDB; meta [ 26] = "Ucirc";
code [ 27] = 0xD9; meta [ 27] = "Ugrave";
code [ 28] = 0xDC; meta [ 28] = "Uuml";
code [ 29] = 0xDD; meta [ 29] = "Yacute";
code [ 30] = 0xE1; meta [ 30] = "aacute";
code [ 31] = 0xE2; meta [ 31] = "acirc";
code [ 32] = 0xB4; meta [ 32] = "acute";
code [ 33] = 0xE6; meta [ 33] = "aelig";
code [ 34] = 0xE0; meta [ 34] = "agrave";
code [ 35] = '&'; meta [ 35] = "amp";
code [ 36] = 0xE5; meta [ 36] = "aring";
code [ 37] = 0xE3; meta [ 37] = "atilde";
code [ 38] = 0xE4; meta [ 38] = "auml";
code [ 39] = 0xA6; meta [ 39] = "brvbar";
code [ 40] = 0xE7; meta [ 40] = "ccedil";
code [ 41] = 0xB8; meta [ 41] = "cedil";
code [ 42] = 0xA2; meta [ 42] = "cent";
code [ 43] = 0xA9; meta [ 43] = "copy";
code [ 44] = 0xA4; meta [ 44] = "curren";
code [ 45] = 0xB0; meta [ 45] = "deg";
code [ 46] = 0xF7; meta [ 46] = "divide";
code [ 47] = 0xE9; meta [ 47] = "eacute";
code [ 48] = 0xEA; meta [ 48] = "ecirc";
code [ 49] = 0xE8; meta [ 49] = "egrave";
code [ 50] = 0xF0; meta [ 50] = "eth";
code [ 51] = 0xEB; meta [ 51] = "euml";
code [ 52] = 0xBD; meta [ 52] = "frac12";
code [ 53] = 0xBC; meta [ 53] = "frac14";
code [ 54] = 0xBE; meta [ 54] = "frac34";
code [ 55] = '>'; meta [ 55] = "gt";
code [ 56] = 0xED; meta [ 56] = "iacute";
code [ 57] = 0xEE; meta [ 57] = "icirc";
code [ 58] = 0xA1; meta [ 58] = "iexcl";
code [ 59] = 0xEC; meta [ 59] = "igrave";
code [ 60] = 0xBF; meta [ 60] = "iquest";
code [ 61] = 0xEF; meta [ 61] = "iuml";
code [ 62] = 0xAB; meta [ 62] = "laquo";
code [ 63] = 0x91; meta [ 63] = "lsquo";
code [ 64] = '<'; meta [ 64] = "lt";
code [ 65] = 0xAF; meta [ 65] = "macr";
code [ 66] = 0xB5; meta [ 66] = "micro";
code [ 67] = 0xB7; meta [ 67] = "middot";
code [ 68] = ' '; meta [ 68] = "nbsp";
code [ 69] = 0xAC; meta [ 69] = "not";
code [ 70] = 0xF1; meta [ 70] = "ntilde";
code [ 71] = 0xF3; meta [ 71] = "oacute";
code [ 72] = 0xF4; meta [ 72] = "ocirc";
code [ 73] = 0xF2; meta [ 73] = "ograve";
code [ 74] = 0xAA; meta [ 74] = "ordf";
code [ 75] = 0xBA; meta [ 75] = "ordm";
code [ 76] = 0xF8; meta [ 76] = "oslash";
code [ 77] = 0xF5; meta [ 77] = "otilde";
code [ 78] = 0xF6; meta [ 78] = "ouml";
code [ 79] = 0xB6; meta [ 79] = "para";
code [ 80] = 0xB1; meta [ 80] = "plusmn";
code [ 81] = 0xA3; meta [ 81] = "pound";
code [ 82] = '"'; meta [ 82] = "quot";
code [ 83] = 0xBB; meta [ 83] = "raquo";
code [ 84] = 0xAE; meta [ 84] = "reg";
code [ 85] = 0x92; meta [ 85] = "rsquo";
code [ 86] = 0xA7; meta [ 86] = "sect";
code [ 87] = 0xAD; meta [ 87] = "shy";
code [ 88] = 0xB9; meta [ 88] = "sup1";
code [ 89] = 0xB2; meta [ 89] = "sup2";
code [ 90] = 0xB3; meta [ 90] = "sup3";
code [ 91] = 0xDF; meta [ 91] = "szlig";
code [ 92] = 0xFE; meta [ 92] = "thorn";
code [ 93] = 0xD7; meta [ 93] = "times";
code [ 94] = 0xFA; meta [ 94] = "uacute";
code [ 95] = 0xFB; meta [ 95] = "ucirc";
code [ 96] = 0xF9; meta [ 96] = "ugrave";
code [ 97] = 0xA8; meta [ 97] = "uml";
code [ 98] = 0xFC; meta [ 98] = "uuml";
code [ 99] = 0xFD; meta [ 99] = "yacute";
code [100] = 0xA5; meta [100] = "yen";
code [101] = 0xFF; meta [101] = "yuml";
#elif (defined (__MSDOS__))
code [ 0] = 0x92; meta [ 0] = "AElig";
code [ 1] = 0xB5; meta [ 1] = "Aacute";
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -