📄 cv.c
字号:
/* -*- mode: c; mode: fold -*- */# include "config.h"# include <stdio.h># include <stdlib.h># include <ctype.h># include "pager.h"/*{{{ typedefs */typedef struct {# ifndef NDEBUG# define MAGIC MKMAGIC ('c', 'o', 'n', 'v') long magic;# endif /* NDEBUG */ int c[256]; /* the conversion table */} conv;/*}}}*//*{{{ new/free */void *cv_new (void){ conv *c; int n; if (c = (conv *) malloc (sizeof (conv))) {# ifndef NDEBUG c -> magic = MAGIC;# endif /* NDEBUG */ for (n = 0; n < 256; ++n) c -> c[n] = n; } return (void *) c;}void *cv_free (void *cv){ conv *c = (conv *) cv; MCHK (c); if (c) free (c); return NULL;}/*}}}*//*{{{ reverse */void *cv_reverse (void *src){ conv *s = (conv *) src; conv *c; int n; MCHK (s); if (c = (conv *) cv_new ()) for (n = 0; n < 256; ++n) if (s -> c[n] != -1) c -> c[s -> c[n]] = n; return (void *) c;}/*}}}*//*{{{ define/undefine */static char_tgetval (char *str){ char_t ret; if (isdigit (*str)) ret = (char_t) strtol (str, NULL, 0); else if (! *(str + 1)) ret = (char_t) *str; else if (*str == '^') { ++str; ret = (char_t) (*str == '?' ? 0x7f : (*str & 0x1f)); } else if (*str == '\\') { ++str; switch (*str) { case 'a': ret = (char_t) '\a'; break; case 'b': ret = (char_t) '\b'; break; case 'e': ret = (char_t) '\x1b'; break; case 'f': ret = (char_t) '\f'; break; case 'l': ret = (char_t) '\012'; break; case 'n': ret = (char_t) '\n'; break; case 'r': ret = (char_t) '\r'; break; case 's': ret = (char_t) ' '; break; case 't': ret = (char_t) '\t'; break; case 'v': ret = (char_t) '\v'; break; default: ret = (char_t) *str; break; } } else ret = (char_t) *str; return ret;}voidcv_define (void *cv, char_t src, char_t dst){ conv *c = (conv *) cv; MCHK (c); if (c) c -> c[src] = dst;}voidcv_sdefine (void *cv, char *src, char *dst){ cv_define (cv, getval (src), getval (dst));}voidcv_undefine (void *cv, char_t ch){ conv *c = (conv *) cv; MCHK (c); if (c) c -> c[ch] = ch;}voidcv_sundefine (void *cv, char *ch){ cv_undefine (cv, getval (ch));}voidcv_invalid (void *cv, char_t ch){ conv *c = (conv *) cv; MCHK (c); if (c) c -> c[ch] = -1;}voidcv_sinvalid (void *cv, char *ch){ cv_invalid (cv, getval (ch));}/*}}}*//*{{{ read/write table */intcv_read_table (void *cv, char *fname){ conv *c = (conv *) cv; FILE *fp; char *line; char *sp, *dp; MCHK (c); if ((! c) || (! (fp = fopen (fname, "r")))) return -1; while (line = getline (fp, True)) { for (sp = line; isspace (*sp); ++sp) ; if (*sp && (*sp != '#')) { dp = skip (sp); skip (dp); if (*sp) if (*dp) c -> c[getval (sp)] = getval (dp); else c -> c[getval (sp)] = -1; } free (line); } fclose (fp); return 0;}intcv_write_table (void *cv, char *fname){ conv *c = (conv *) cv; FILE *fp; int n; MCHK (c); if ((! c) || (! (fp = fopen (fname, "w")))) return -1; fprintf (fp, "#\tThis file is generated automatically\n"); for (n = 0; n < 256; ++n) { if ((! (n & 0x80)) && isprint (n)) fprintf (fp, "#\t%c\n", (char) n); if (c -> c[n] != -1) fprintf (fp, "0x%02x\t0x%02x\n", n, c -> c[n]); else fprintf (fp, "0x%02x\n", n); } fclose (fp); return 0;}/*}}}*//*{{{ merging */voidcv_merge (void *cv, void *in, Bool second){ conv *c = (conv *) cv, *i = (conv *) in; int n; MCHK (c); MCHK (i); if (c && i) for (n = 0; n < 256; ++n) if (second || (c -> c[n] == n)) c -> c[n] = i -> c[n];}/*}}}*//*{{{ converting */intcv_conv (void *cv, char_t ch){ conv *c = (conv *) cv; MCHK (c); return c ? c -> c[ch] : (int) ch;}/*}}}*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -