filt_ahxd.c.svn-base

来自「SumatraPDF是一款小型开源的pdf阅读工具。虽然玲珑小巧(只有800多K」· SVN-BASE 代码 · 共 113 行

SVN-BASE
113
字号
#include "fitz-base.h"#include "fitz-stream.h"typedef struct fz_ahxd_s fz_ahxd;struct fz_ahxd_s{	fz_filter super;	int odd;	int a;};static inline int iswhite(int a){	switch (a) {	case '\n': case '\r': case '\t': case ' ':	case '\0': case '\f': case '\b': case 0177:		return 1;	}	return 0;}static inline int ishex(int a){	return (a >= 'A' && a <= 'F') ||		(a >= 'a' && a <= 'f') ||		(a >= '0' && a <= '9');}static inline int fromhex(int a){	if (a >= 'A' && a <= 'F')		return a - 'A' + 0xA;	if (a >= 'a' && a <= 'f')		return a - 'a' + 0xA;	if (a >= '0' && a <= '9')		return a - '0';	return 0;}fz_error *fz_newahxd(fz_filter **fp, fz_obj *params){	FZ_NEWFILTER(fz_ahxd, f, ahxd);	f->odd = 0;	f->a = 0;	return fz_okay;}voidfz_dropahxd(fz_filter *f){}fz_error *fz_processahxd(fz_filter *filter, fz_buffer *in, fz_buffer *out){	fz_ahxd *f = (fz_ahxd*)filter;	int b, c;	while (1)	{		if (in->rp == in->wp)			return fz_ioneedin;		if (out->wp == out->ep)			return fz_ioneedout;		c = *in->rp++;		if (ishex(c)) {			if (!f->odd) {				f->a = fromhex(c);				f->odd = 1;			}			else {				b = fromhex(c);				*out->wp++ = (f->a << 4) | b;				f->odd = 0;			}		}		else if (c == '>') {			if (f->odd)				*out->wp++ = (f->a << 4);			return fz_iodone;		}		else if (!iswhite(c)) {			return fz_throw("bad data in ahxd: '%c'", c);		}	}}voidfz_pushbackahxd(fz_filter *filter, fz_buffer *in, fz_buffer *out, int n){	int k;	assert(filter->process == fz_processahxd);	assert(out->wp - n >= out->rp);	k = 0;	while (k < n * 2) {		in->rp --;		if (ishex(*in->rp))			k ++;	}	out->wp -= n;}

⌨️ 快捷键说明

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