mercurial/cext/charencode.h
changeset 33758 0f4ac3b6dee4
parent 33756 5866ba5e9c48
child 33759 a22339d389d4
equal deleted inserted replaced
33757:e9996bd7203f 33758:0f4ac3b6dee4
       
     1 /*
       
     2  charencode.h - miscellaneous character encoding
       
     3 
       
     4  This software may be used and distributed according to the terms of
       
     5  the GNU General Public License, incorporated herein by reference.
       
     6 */
       
     7 
       
     8 #ifndef _HG_CHARENCODE_H_
       
     9 #define _HG_CHARENCODE_H_
       
    10 
       
    11 #include <Python.h>
       
    12 #include "compat.h"
       
    13 
       
    14 /* This should be kept in sync with normcasespecs in encoding.py. */
       
    15 enum normcase_spec {
       
    16 	NORMCASE_LOWER = -1,
       
    17 	NORMCASE_UPPER = 1,
       
    18 	NORMCASE_OTHER = 0
       
    19 };
       
    20 
       
    21 PyObject *unhexlify(const char *str, int len);
       
    22 PyObject *asciilower(PyObject *self, PyObject *args);
       
    23 PyObject *asciiupper(PyObject *self, PyObject *args);
       
    24 PyObject *make_file_foldmap(PyObject *self, PyObject *args);
       
    25 
       
    26 static const int8_t hextable[256] = {
       
    27 	-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
       
    28 	-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
       
    29 	-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
       
    30 	 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, -1, -1, -1, -1, -1, -1, /* 0-9 */
       
    31 	-1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* A-F */
       
    32 	-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
       
    33 	-1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* a-f */
       
    34 	-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
       
    35 	-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
       
    36 	-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
       
    37 	-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
       
    38 	-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
       
    39 	-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
       
    40 	-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
       
    41 	-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
       
    42 	-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
       
    43 };
       
    44 
       
    45 static inline int hexdigit(const char *p, Py_ssize_t off)
       
    46 {
       
    47 	int8_t val = hextable[(unsigned char)p[off]];
       
    48 
       
    49 	if (val >= 0) {
       
    50 		return val;
       
    51 	}
       
    52 
       
    53 	PyErr_SetString(PyExc_ValueError, "input contains non-hex character");
       
    54 	return 0;
       
    55 }
       
    56 
       
    57 #endif /* _HG_CHARENCODE_H_ */