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

📄 htchunk.c

📁 elinks下lynx是最重要的二个文本浏览器, 在linux下非常实用, lynx比elinks早的多, 目前好像停止开发, 这是lynx源代码
💻 C
字号:
/*		Chunk handling:	Flexible arrays**		===============================***/#include <HTUtils.h>#include <HTChunk.h>#include <LYLeaks.h>/***	Initialize a chunk with a certain allocation unit*/PUBLIC void HTChunkInit ARGS2 (HTChunk *,ch, int,grow){    ch->data = 0;    ch->growby = grow;    ch->size = 0;    ch->allocated = 0;}/*	Create a chunk with a certain allocation unit**	--------------*/PUBLIC HTChunk * HTChunkCreate ARGS1 (int,grow){    HTChunk * ch = typecalloc(HTChunk);    if (ch == NULL)	outofmem(__FILE__, "creation of chunk");    HTChunkInit (ch, grow);    return ch;}PUBLIC HTChunk * HTChunkCreateMayFail ARGS2 (int,grow, int,failok){    HTChunk * ch = typecalloc(HTChunk);    if (ch == NULL) {	if (!failok) {	    outofmem(__FILE__, "creation of chunk");	} else {	    return ch;	}    }    HTChunkInit (ch, grow);    ch->failok = failok;    return ch;}/*	Create a chunk with a certain allocation unit and ensured size**	--------------*/PUBLIC HTChunk * HTChunkCreate2 ARGS2 (int,grow, size_t, needed){    HTChunk * ch = typecalloc(HTChunk);    if (ch == NULL)	outofmem(__FILE__, "HTChunkCreate2");    HTChunkInit (ch, grow);    if (needed > 0) {	ch->allocated = needed-1 - ((needed-1) % ch->growby)	    + ch->growby; /* Round up */	CTRACE((tfp, "HTChunkCreate2: requested %d, allocate %d\n",	       (int) needed, ch->allocated));	ch->data = typecallocn(char, ch->allocated);	if (!ch->data)	    outofmem(__FILE__, "HTChunkCreate2 data");    }    return ch;}/*	Clear a chunk of all data**	--------------------------*/PUBLIC void HTChunkClear ARGS1 (HTChunk *,ch){    FREE(ch->data);    ch->size = 0;    ch->allocated = 0;}/*	Free a chunk**	------------*/PUBLIC void HTChunkFree ARGS1 (HTChunk *,ch){    FREE(ch->data);    FREE(ch);}/*	Realloc the chunk**	-----------------*/PUBLIC BOOL HTChunkRealloc ARGS2 (HTChunk *,ch, int,growby){    char *data;    ch->allocated = ch->allocated + growby;    data = ch->data ? (char *)realloc(ch->data, ch->allocated)			: typecallocn(char, ch->allocated);    if (data) {	ch->data = data;    } else if (ch->failok) {	HTChunkClear(ch);	/* allocation failed, clear all data - kw */	return FALSE;		/* caller should check ch->allocated - kw */    } else {	outofmem(__FILE__, "HTChunkRealloc");    }    return TRUE;}/*	Append a character**	------------------*//* Warning: the code of this function is defined as macro in SGML.c. Change  the macro or undefine it in SGML.c when changing this function. -VH */PUBLIC void HTChunkPutc ARGS2 (HTChunk *,ch, char,c){    if (ch->size >= ch->allocated) {	if (!HTChunkRealloc(ch, ch->growby))	    return;    }    ch->data[ch->size++] = c;}/*	Ensure a certain size**	---------------------*/PUBLIC void HTChunkEnsure ARGS2 (HTChunk *,ch, int,needed){    if (needed <= ch->allocated) return;    ch->allocated = needed-1 - ((needed-1) % ch->growby)			     + ch->growby; /* Round up */    ch->data = ch->data ? (char *)realloc(ch->data, ch->allocated)			: typecallocn(char, ch->allocated);    if (ch->data == NULL)	outofmem(__FILE__, "HTChunkEnsure");}PUBLIC void HTChunkPutb ARGS3 (HTChunk *,ch, CONST char *,b, int,l){    if (l <= 0) return;    if (ch->size + l > ch->allocated) {	int growby = l - (l % ch->growby) + ch->growby; /* Round up */	if (!HTChunkRealloc(ch, growby))	    return;    }    memcpy(ch->data + ch->size, b, l);    ch->size += l;}#define PUTC(code) ch->data[ch->size++] = (char)(code)#define PUTC2(code) ch->data[ch->size++] = (char)(0x80|(0x3f &(code)))PUBLIC void HTChunkPutUtf8Char ARGS2(	HTChunk *,	ch,	UCode_t,	code){    int utflen;    if (TOASCII(code) < 128)	utflen = 1;    else if   (code <     0x800L) {	utflen = 2;    } else if (code <   0x10000L) {	utflen = 3;    } else if (code <  0x200000L) {	utflen = 4;    } else if (code < 0x4000000L) {	utflen = 5;    } else if (code<=0x7fffffffL) {	utflen = 6;    } else	utflen = 0;    if (ch->size + utflen > ch->allocated) {	int growby = (ch->growby >= utflen) ? ch->growby : utflen;	if (!HTChunkRealloc(ch, growby))	    return;    }    switch (utflen) {    case 0:	return;    case 1:	ch->data[ch->size++] = (char)code;	return;    case 2:	PUTC(0xc0 | (code>>6));	break;    case 3:	PUTC(0xe0 | (code>>12));	break;    case 4:	PUTC(0xf0 | (code>>18));	break;    case 5:	PUTC(0xf8 | (code>>24));	break;    case 6:	PUTC(0xfc | (code>>30));	break;    }    switch (utflen) {    case 6:	PUTC2(code>>24);	/* FALLTHRU */    case 5:	PUTC2(code>>18);	/* FALLTHRU */    case 4:	PUTC2(code>>12);	/* FALLTHRU */    case 3:	PUTC2(code>>6);	/* FALLTHRU */    case 2:	PUTC2(code);	break;    }}/*	Terminate a chunk**	-----------------*/PUBLIC void HTChunkTerminate ARGS1 (HTChunk *,ch){    HTChunkPutc(ch, (char)0);}/*	Append a string**	---------------*/PUBLIC void HTChunkPuts ARGS2 (HTChunk *,ch, CONST char *,s){    CONST char * p;    for (p = s; *p; p++) {	if (ch->size >= ch->allocated) {	    if (!HTChunkRealloc(ch, ch->growby))		return;	}	ch->data[ch->size++] = *p;    }}

⌨️ 快捷键说明

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