remap.c
来自「字体缩放显示」· C语言 代码 · 共 691 行 · 第 1/2 页
C
691 行
/* * Copyright 1996, 1997, 1998, 1999 Computing Research Labs, * New Mexico State University * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE COMPUTING RESEARCH LAB OR NEW MEXICO STATE UNIVERSITY BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT * OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * THE USE OR OTHER DEALINGS IN THE SOFTWARE. */#ifndef lint#ifdef __GNUC__static char rcsid[] __attribute__ ((unused)) = "$Id: remap.c,v 1.1.1.1 2000/04/14 17:53:50 davidT Exp $";#elsestatic char rcsid[] = "$Id: remap.c,v 1.1.1.1 2000/04/14 17:53:50 davidT Exp $";#endif#endif#include <stdio.h>#include <string.h>#ifdef WIN32#include <windows.h>#else#include <stdlib.h>#include <unistd.h>#endif/* * Structure for managing simple lists in place. */typedef struct { unsigned char *bfield; unsigned long bsize; unsigned long bused; unsigned char **field; unsigned long size; unsigned long used;} list_t;/* * Callback type used with the high speed text file reader function. */typedef int (*scanlines_callback_t)(#ifdef __STDC__ unsigned char *line, unsigned long linelen, unsigned long lineno, void *client_data#endif);/* * Various utility routines. */#define setsbit(m, cc) (m[(cc) >> 3] |= (1 << ((cc) & 7)))#define sbitset(m, cc) (m[(cc) >> 3] & (1 << ((cc) & 7)))/* * An empty string for empty fields. */static unsigned char empty[1] = { 0 };/* * Assume the line is NULL terminated and that the `list' parameter was * initialized the first time it was used. */static void#ifdef __STDC__splitline(unsigned char *separators, unsigned char *line, unsigned long linelen, list_t *list)#elsesplitline(separators, line, linelen, list)unsigned char *separators, *line;unsigned long linelen;list_t *list;#endif{ int mult, final_empty; unsigned char *sp, *ep, *end; unsigned char seps[32]; /* * Initialize the list. */ list->used = list->bused = 0; /* * If the line is empty, then simply return. */ if (linelen == 0 || line[0] == 0) return; /* * If the `separators' parameter is NULL or empty, split the list into * individual bytes. */ if (separators == 0 || *separators == 0) { if (linelen > list->bsize) { if (list->bsize) list->bfield = (unsigned char *) malloc(linelen); else list->bfield = (unsigned char *) realloc(list->bfield, linelen); list->bsize = linelen; } list->bused = linelen; (void) memcpy(list->bfield, line, linelen); return; } /* * Prepare the separator bitmap. */ (void) memset((char *) seps, 0, 32); /* * If the very last character of the separator string is a plus, then set * the `mult' flag to indicate that multiple separators should be * collapsed into one. */ for (mult = 0, sp = separators; sp && *sp; sp++) { if (*sp == '+' && *(sp + 1) == 0) mult = 1; else setsbit(seps, *sp); } /* * Break the line up into fields. */ for (final_empty = 0, sp = ep = line, end = sp + linelen; sp < end && *sp;) { /* * Collect everything that is not a separator. */ for (; ep < end && *ep && !sbitset(seps, *ep); ep++) ; /* * Resize the list if necessary. */ if (list->used == list->size) { if (list->size == 0) list->field = (unsigned char **) malloc(sizeof(unsigned char *) << 3); else list->field = (unsigned char **) realloc((char *) list->field, sizeof(unsigned char *) * (list->size + 8)); list->size += 8; } /* * Assign the field appropriately. */ list->field[list->used++] = (ep > sp) ? sp : empty; sp = ep; if (mult) { /* * If multiple separators should be collapsed, do it now by * setting all the separator characters to 0. */ for (; ep < end && *ep && sbitset(seps, *ep); ep++) *ep = 0; } else /* * Don't collapse multiple separators by making them 0, so just * make the one encountered 0. */ *ep++ = 0; final_empty = (ep > sp && *ep == 0); sp = ep; } /* * Finally, NULL terminate the list. */ if (list->used + final_empty + 1 >= list->size) { if (list->used == list->size) { if (list->size == 0) list->field = (unsigned char **) malloc(sizeof(unsigned char *) << 3); else list->field = (unsigned char **) realloc((unsigned char *) list->field, sizeof(char *) * (list->size + 8)); list->size += 8; } } if (final_empty) list->field[list->used++] = empty; if (list->used == list->size) { if (list->size == 0) list->field = (unsigned char **) malloc(sizeof(unsigned char *) << 3); else list->field = (unsigned char **) realloc((char *) list->field, sizeof(unsigned char *) * (list->size + 8)); list->size += 8; } list->field[list->used] = 0;}static int#ifdef __STDC__scanlines(int fd, scanlines_callback_t callback, void *client_data, unsigned long *lineno)#elsescanlines(fd, callback, client_data, lineno)int fd;scanlines_callback_t callback;void *client_data;unsigned long *lineno;#endif{ unsigned long lno; int n, res, done, refill, bytes, hold; char *ls, *le, *pp, *pe, *hp; char buf[65536]; if (callback == 0) return -1; lno = 1; (void) memset(buf, 0, 65536); res = done = 0; pp = ls = le = buf; bytes = 65536; while (!done && (n = read(fd, pp, bytes)) > 0) { /* * Determine the new end of the buffer pages. */ pe = pp + n; for (refill = 0; done == 0 && refill == 0; ) { while (le < pe && *le != '\n' && *le != '\r') le++; if (le == pe) { /* * Hit the end of the last page in the buffer. * Need to find out how many pages to shift * and how many pages need to be read in. * Adjust the line start and end pointers down * to point to the right places in the pages. */ pp = buf + (((ls - buf) >> 13) << 13); n = pp - buf; ls -= n; le -= n; n = pe - pp; (void) memcpy(buf, pp, n); pp = buf + n; bytes = 65536 - n; refill = 1; } else { /* * Temporarily NULL terminate the line. */ hp = le; hold = *le; *le = 0; if (callback && *ls != '#' && *ls != 0x1a && le > ls && (res = (*callback)((unsigned char *) ls, le - ls, lno, client_data)) != 0) done = 1; else { ls = ++le; /* * Handle the case of DOS CRLF sequences. */ if (le < pe && hold == '\n' && *le =='\r') ls = ++le; } /* * Increment the line number. */ lno++; /* * Restore the character at the end of the line. */ *hp = hold; } } } /* * Return with the last line number processed. */ *lineno = lno; return res;}static unsigned char a2i[128] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};static unsigned char odigits[32] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,};static unsigned char ddigits[32] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,};static unsigned char hdigits[32] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x03, 0x7e, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?