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

📄 util.c

📁 使用Modem发送网上传呼
💻 C
字号:
/*	-*- mode: c; mode: fold -*-	*/# include	"config.h"# include	<stdio.h># include	<stdlib.h># include	<stdarg.h># include	<ctype.h># include	<string.h># include	<time.h># include	"pager.h"/*{{{	utility functions */char *skip (char *str){	while (*str && (! isspace (*str)))		++str;	if (*str) {		*str++ = '\0';		while (isspace (*str))			++str;	}	return str;}char *skipch (char *str, char ch){	while (*str && (*str != ch))		++str;	if (*str) {		*str++ = '\0';		while (isspace (*str))			++str;	}	return str;}char *getline (FILE *fp, Bool cont){	char	*buf;	int	size;	char	*ret;	int	len;	char	*ptr;	size = 256;	if (! (buf = malloc (size + 2)))		return NULL;	len = 0;	while (ret = fgets (buf + len, size - len - 2, fp)) {		if (ptr = strchr (buf + len, '\n')) {			*ptr = '\0';			len += strlen (buf + len);			if (! cont)				break;			if (len && (buf[len - 1] == '\\')) {				--len;				buf[len] = '\0';			} else				break;		} else			len += strlen (buf + len);		if (len + 64 >= size) {			size += size;			if (! (buf = Realloc (buf, size + 2)))				break;		}	}	if ((! ret) && buf) {		free (buf);		buf = NULL;	}	return len || ret ? buf : NULL;}intverbose_out (char *fmt, ...){	va_list	par;		va_start (par, fmt);	vfprintf (stdout, fmt, par);	va_end (par);	return 0;}/*}}}*//*{{{	string_t handling */string_t *snewc (char *str){	string_t	*s;		if (s = (string_t *) malloc (sizeof (string_t))) {		s -> str = NULL;		if (str) {			s -> len = strlen (str);			s -> size = s -> len + 1;			if (s -> str = (char_t *) malloc (sizeof (char_t) * s -> size))				memcpy (s -> str, str, s -> len);			else {				free (s);				s = NULL;			}		} else {			s -> len = 0;			s -> size = 0;		}	}	return s;}string_t *snew (char_t *str, int len){	string_t	*s;		if (s = (string_t *) malloc (sizeof (string_t))) {		s -> str = NULL;		s -> len = 0;		s -> size = 0;		if (len > 0)			if (s -> str = (char_t *) malloc (sizeof (char_t) * (len + 1))) {				s -> size = len + 1;				if (str) {					s -> len = len;					memcpy (s -> str, str, len);				} else					s -> len = 0;			} else {				free (s);				s = NULL;			}	}	return s;}Boolsexpand (string_t *s, int nsize){	if (s && (nsize + 2 > s -> size)) {		s -> size = nsize + 2;		if (! (s -> str = (char_t *) Realloc (s -> str, sizeof (char_t) * s -> size))) {			s -> size = 0;			s -> len = 0;			return False;		}	}	return True;}Boolscopy (string_t *dst, string_t *src){	if (dst && src && sexpand (dst, src -> len + 1)) {		if (src -> str) {			memcpy (dst -> str, src -> str, src -> len);			dst -> len = src -> len;		} else			dst -> len = 0;		return True;	}	return False;}Boolscat (string_t *dst, string_t *src){	if (dst && src && sexpand (dst, dst -> len + src -> len + 1)) {		if (src -> str) {			memcpy (dst -> str + dst -> len, src -> str, src -> len);			dst -> len += src -> len;		}		return True;	}	return False;}static Booldostr (string_t *dst, char *src, Bool (*func) (string_t *, string_t *)){	Bool		ret;	string_t	*rsrc;				ret = False;	if (dst)		if (src) {			if (rsrc = snewc (src)) {				ret = (*func) (dst, rsrc);				sfree (rsrc);			}		} else			ret = True;	return ret;}Boolscopyc (string_t *dst, char *src){	return dostr (dst, src, scopy);}Boolscatc (string_t *dst, char *src){	return dostr (dst, src, scat);}string_t *scut (string_t *str, int start, int len){	string_t	*res;	if (len < 0)		len = str ? str -> len - start : 0;	if (res = snew (NULL, len + 1)) {		if (str -> len > start) {			if (str -> len - start < len)				len = str -> len - start;		} else			len = 0;		if (len > 0)			memcpy (res -> str, str -> str + start, len);		res -> len = len;	}	return res;}voidsdel (string_t *str, int start, int len){	int	size;		if (str -> len > start) {		if (str -> len - start < len)			len = str -> len - start;	} else		len = 0;	if (len > 0) {		size = str -> len - (start + len);		if (size > 0)			memcpy (str -> str + start, str -> str + start + len, str -> len - (start + len));		str -> len -= len;	}}Boolsput (string_t *str, string_t *ins, int pos, int len){	if ((len < 0) || (len > ins -> len))		len = ins -> len;	if (len + pos >= str -> size)		if (! sexpand (str, len + pos + 1))			return False;	memcpy (str -> str + pos, ins -> str, len);	if (str -> len < len + pos)		str -> len = len + pos;	return True;}	Boolsputc (string_t *str, char *ins, int pos, int len){	Bool		ret;	string_t	*rins;				ret = False;	if (str && ins && (rins = snewc (ins))) {		ret = sput (str, rins, pos, len);		sfree (rins);	}	return ret;}char *sextract (string_t *s){	char	*ret;		ret = NULL;	if (s)		if (ret = malloc (s -> len + 1))			if (s -> str) {				memcpy (ret, s -> str, s -> len);				ret[s -> len] = '\0';			} else				ret[0] = '\0';	return ret;}char *schar (string_t *s){	if (s) {		if (s -> len + 1>= s -> size)			sexpand (s, s -> len + 2);		if (s -> len + 1 < s -> size) {			s -> str[s -> len] = '\0';			return (char *) s -> str;		}	}	return NULL;}void *sfree (string_t *s){	if (s) {		if (s -> str)			free (s -> str);		free (s);	}	return NULL;}voidsrelease (string_t *s){	if (s -> size + 1 > s -> len) {		s -> size = s -> len + 1;		if (! (s -> str = (char_t *) Realloc (s -> str, sizeof (char_t) * (s -> size + 2)))) {			s -> size = 0;			s -> len = 0;		}	}}Boolsiscntrl (string_t *s, int pos){	return (s && (pos >= 0) && (pos < s -> len) && iscntrl (s -> str[pos])) ? True : False;}Boolsisspace (string_t *s, int pos){	return (s && (pos >= 0) && (pos < s -> len) && isspace (s -> str[pos])) ? True : False;}Boolsisdigit (string_t *s, int pos){	return (s && (pos >= 0) && (pos < s -> len) && isdigit (s -> str[pos])) ? True : False;}intstoi (string_t *s){	int	ret;		ret = 0;	if (s && s -> str) {		s -> str[s -> len] = '\0';		ret = atoi ((char *) s -> str);	}	return ret;}/*}}}*//*{{{	date_t handling */# if		! HAVE_MEMSET && ! HAVE_BZEROstatic voiddozero (void *p, int len){	unsigned char	*ptr = (char *) p;		while (len-- > 0)		*ptr++ = 0;}# endif		/* ! HAVE_MEMSET && ! HAVE_BZERO */date_t *dat_free (date_t *d){	if (d)		free (d);	return NULL;}date_t *dat_parse (char *str){	date_t		*d;	time_t		tim;	struct tm	*tt;	struct tm	tm;	Bool		add;	char		*ptr, *sav;	char		*p1, *p2;	int		mode;	int		n, val;	char		sep;	date_t		tmp;	d = NULL;	if ((! str) || (str = strdup (str))) {		if (d = (date_t *) malloc (sizeof (date_t))) {			time (& tim);			if (tt = localtime (& tim)) {				d -> day = tt -> tm_mday;				d -> mon = tt -> tm_mon + 1;				d -> year = tt -> tm_year + 1900;				d -> hour = tt -> tm_hour;				d -> min = tt -> tm_min;				d -> sec = tt -> tm_sec;			} else {				d -> day = 1;				d -> mon = 1;				d -> year = 1970;				d -> hour = 0;				d -> min = 0;				d -> sec = 0;			}			if (str && strcmp (str, "now")) {				if (*str == '+') {					add = True;					ptr = str + 1;				} else {					add = False;					ptr = str;				}				tmp.day = -1;				tmp.mon = -1;				tmp.year = -1;				tmp.hour = -1;				tmp.min = -1;				tmp.sec = -1;				while (*ptr) {					sav = ptr;					ptr = skip (ptr);					if (strchr (sav, '.')) {						sep = '.';						mode = 1;					} else if (strchr (sav, '/')) {						sep = '/';						mode = 2;					} else if (strchr (sav, ':')) {						sep = ':';						mode = 3;					} else {						sep = '\0';						mode = 0;					}					for (p1 = sav, n = 0; *p1; ++n) {						p2 = p1;						p1 = skipch (p1, sep);						val = atoi (p2);						switch (mode) {						case 0:							tmp.sec = 0;							if (val < 30) {								tmp.hour = val;								tmp.min = 0;							} else {								tmp.hour = val / 60;								tmp.min = val % 60;							}							break;						case 1:							if (n == 0)								tmp.day = val;							else if (n == 1)								tmp.mon = val;							else if (n == 2) {								if ((! add) && (val < 1900))									val += 1900;								tmp.year = val;							}							break;						case 2:							if (n == 0)								tmp.mon = val;							else if (n == 1)								tmp.day = val;							else if (n == 2) {								if ((! add) && (val < 1900))									val += 1900;								tmp.year = val;							}							break;						case 3:							if (n == 0) {								tmp.hour = val;								tmp.min = 0;								tmp.sec = 0;							} else if (n == 1)								tmp.min = val;							else if (n == 2)								tmp.sec = val;							break;						}					}				}				if (add) {					if (tmp.day != -1)						d -> day += tmp.day;					if (tmp.mon != -1)						d -> mon += tmp.mon;					if (tmp.year != -1)						d -> year += tmp.year;					if (tmp.hour != -1)						d -> hour += tmp.hour;					if (tmp.min != -1)						d -> min += tmp.min;					if (tmp.sec != -1)						d -> sec += tmp.sec;				} else {					if (tmp.day != -1)						d -> day = tmp.day;					if (tmp.mon != -1)						d -> mon = tmp.mon;					if (tmp.year != -1)						d -> year = tmp.year;					if (tmp.hour != -1)						d -> hour = tmp.hour;					if (tmp.min != -1)						d -> min = tmp.min;					if (tmp.sec != -1)						d -> sec = tmp.sec;				}# if		HAVE_MEMSET				memset (& tm, 0, sizeof (tm));# elif		HAVE_BZERO								bzero (& tm, sizeof (tm));# else				dozero (& tm, sizeof (tm));# endif		/* ! HAVE_MEMSET && ! HAVE_BZERO */				tm.tm_mday = d -> day;				tm.tm_mon = d -> mon - 1;				tm.tm_year = d -> year - 1900;				tm.tm_hour = d -> hour;				tm.tm_min = d -> min;				tm.tm_sec = d -> sec;				tm.tm_isdst = tt -> tm_isdst;				if (mktime (& tm) == (time_t) -1) 					d = dat_free (d);				else {					d -> day = tm.tm_mday;					d -> mon = tm.tm_mon + 1;					d -> year = tm.tm_year + 1900;					d -> hour = tm.tm_hour;					d -> min = tm.tm_min;					d -> sec = tm.tm_sec;				}			}		}		if (str)			free (str);	}	return d;}intdat_diff (date_t *d1, date_t *d2){	int	v1, v2;		if (d1)		v1 = (((((d1 -> year * 12 + d1 -> mon) * 31 + d1 -> day) * 24 + d1 -> hour) * 60 + d1 -> min) * 60 + d1 -> sec);	else		v1 = 0;	if (d2)		v2 = (((((d2 -> year * 12 + d2 -> mon) * 31 + d2 -> day) * 24 + d2 -> hour) * 60 + d2 -> min) * 60 + d2 -> sec);	else		v2 = 0;	return v2 - v1;}voiddat_clear (date_t *d){	d -> day = 0;	d -> mon = 0;	d -> year = 0;	d -> hour = 0;	d -> min = 0;	d -> sec = 0;}voiddat_localtime (date_t *d){	time_t		tim;	struct tm	*tt;		time (& tim);	if (tt = localtime (& tim)) {		d -> day = tt -> tm_mday;		d -> mon = tt -> tm_mon + 1;		d -> year = tt -> tm_year + 1900;		d -> hour = tt -> tm_hour;		d -> min = tt -> tm_min;		d -> sec = tt -> tm_sec;	} else		dat_clear (d);}/*}}}*/

⌨️ 快捷键说明

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