⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lexinput.c

📁 这是一个Linux下的集成开发环境
💻 C
字号:
/*Copyright (c) 2000, Red Hat, Inc.This file is part of Source-Navigator.Source-Navigator is free software; you can redistribute it and/ormodify it under the terms of the GNU General Public License as publishedby the Free Software Foundation; either version 2, or (at your option)any later version.Source-Navigator is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNUGeneral Public License for more details.You should have received a copy of the GNU General Public License alongwith Source-Navigator; see the file COPYING.  If not, write tothe Free Software Foundation, 59 Temple Place - Suite 330, Boston,MA 02111-1307, USA.*//*  * lexinput.c * * Copyright (C) 1998 Cygnus Solutions * * Description: * * Implements a set of routines that can be used by scanners (and scanners * generated by tools such as GNU flex) for translating character set encodings * to ASCII using the Tcl library. */#include <stdlib.h>#include <tcl.h>static size_t translate_crlf(char* buffer, size_t size);static Tcl_Encoding ascii = NULL;extern Tcl_Encoding encoding;static start_of_file = 1;static saved_cr = 0;extern FILE * yyin;intsn_encoded_input(char *buf, int max_size){  char *rawbuf, *utf8buf;  int srcRead, dstWrote, nbytes, flags = 0;  static Tcl_EncodingState utf8_state, ascii_state;  if (encoding == NULL)    {      /*       * No translation necessary. Just look for CRLF       * sequences and remove the CR character.       */      size_t read = fread(buf, sizeof(char), max_size, yyin);      read -= translate_crlf(buf, read);      return read;    }        if (ascii == NULL)    {      ascii = Tcl_GetEncoding(NULL, "ascii");      if (ascii == NULL)	{	  fprintf(stderr, "Unable to locate `ascii' encoding\n");	  return 0;	}    }  if (start_of_file)    {      flags |= TCL_ENCODING_START;    }  if ((rawbuf = (char *) ckalloc(max_size)) == NULL)    {      /* Insufficient memory. */      return 0;    }  /* FIXME: This ought to do it. */  if ((utf8buf = (char *) ckalloc(2 * max_size)) == NULL)    {      /* Insufficient memory. */      return 0;    }  /* Read max_size bytes from disk. */  nbytes = fread(rawbuf, sizeof(unsigned char), sizeof(rawbuf), yyin);  if (nbytes == 0)    {      /* Continue on with an empty buffer; this allows the Tcl	 encoding routines to do any necessary finalisation.	 See the Encoding(n) man page. */      flags = TCL_ENCODING_END;    }    /* Translate encoded file data into UTF-8. */  Tcl_ExternalToUtf(NULL, encoding, rawbuf, nbytes, flags,		    &utf8_state, utf8buf, 2 * max_size,		    &srcRead, &dstWrote, NULL);  /* Look for CRLF sequences and remove the CR characters */  dstWrote -= translate_crlf(utf8buf, dstWrote);  /* FIXME This code assumes that an encoded stream `n' bytes long     will always reduce down to an ASCII stream no longer than `n'     bytes. This is a reasonable assumption, but probably not     foolproof. */  /* Translate this from UTF-8 to ASCII. */  Tcl_UtfToExternal(NULL, ascii, utf8buf, dstWrote, flags,		    &ascii_state, buf, max_size,		    &srcRead, &dstWrote, NULL);  if (dstWrote > 0 && start_of_file)    {      start_of_file = 0;    }  ckfree(utf8buf);  ckfree(rawbuf);  return dstWrote;}voidsn_reset_encoding(){  start_of_file = 1;  saved_cr = 0;}/* Accept a buffer that could contain CRLF sequences and convert * the CRLF to a plain LF. Return the number of CR characters * that were removed as a result of the translation. */size_t translate_crlf(char* buffer, size_t size){  int removed = 0;  char *dtmp, *stmp;  if (size == 0)    {      return 0;    }  if (saved_cr)    {      if (*buffer == '\n')        {          /* Do nothing, removes CR */        }      else        {          /* A lone CR should never appear in the input */          panic("CR without trailing LF on buffer border");        }      saved_cr = 0;    }  for (dtmp = stmp = buffer; (stmp - buffer) < size ; stmp++, dtmp++)    {      if ((*stmp == '\r') && (*(stmp + 1) == '\n'))        {          stmp++;          removed++;        }      if (dtmp != stmp)        {          *dtmp = *stmp;        }    }  if (*stmp == '\r')    {      saved_cr = 1;      removed++;    }  return removed;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -