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

📄 log.c

📁 早期freebsd实现
💻 C
📖 第 1 页 / 共 2 页
字号:
	key.data = &ep->l_cur;	key.size = sizeof(recno_t);	data.data = ep->l_lp;	data.size = sizeof(u_char) + sizeof(LMARK);	if (ep->log->put(ep->log, &key, &data, 0) == -1)		LOG_ERR;#if defined(DEBUG) && 0	TRACE(sp, "%lu: mark %c: %lu/%u\n",	    ep->l_cur, lmp->name, lmp->lno, lmp->cno);#endif	/* Reset high water mark. */	ep->l_high = ++ep->l_cur;	return (0);}/* * Log_backward -- *	Roll the log backward one operation. */intlog_backward(sp, ep, rp)	SCR *sp;	EXF *ep;	MARK *rp;{	DBT key, data;	LMARK lm;	MARK m;	recno_t lno;	int didop;	u_char *p;	if (F_ISSET(ep, F_NOLOG)) {		msgq(sp, M_ERR,		    "Logging not being performed, undo not possible.");		return (1);	}	if (ep->l_cur == 1) {		msgq(sp, M_BERR, "No changes to undo.");		return (1);	}	F_SET(ep, F_NOLOG);		/* Turn off logging. */	key.data = &ep->l_cur;		/* Initialize db request. */	key.size = sizeof(recno_t);	for (didop = 0;;) {		--ep->l_cur;		if (ep->log->get(ep->log, &key, &data, 0))			LOG_ERR;#if defined(DEBUG) && 0		log_trace(sp, "log_backward", ep->l_cur, data.data);#endif		switch (*(p = (u_char *)data.data)) {		case LOG_CURSOR_INIT:			if (didop) {				memmove(rp, p + sizeof(u_char), sizeof(MARK));				F_CLR(ep, F_NOLOG);				return (0);			}			break;		case LOG_CURSOR_END:			break;		case LOG_LINE_APPEND:		case LOG_LINE_INSERT:			didop = 1;			memmove(&lno, p + sizeof(u_char), sizeof(recno_t));			if (file_dline(sp, ep, lno))				goto err;			++sp->rptlines[L_DELETED];			break;		case LOG_LINE_DELETE:			didop = 1;			memmove(&lno, p + sizeof(u_char), sizeof(recno_t));			if (file_iline(sp, ep, lno, p + sizeof(u_char) +			    sizeof(recno_t), data.size - sizeof(u_char) -			    sizeof(recno_t)))				goto err;			++sp->rptlines[L_ADDED];			break;		case LOG_LINE_RESET_F:			break;		case LOG_LINE_RESET_B:			didop = 1;			memmove(&lno, p + sizeof(u_char), sizeof(recno_t));			if (file_sline(sp, ep, lno, p + sizeof(u_char) +			    sizeof(recno_t), data.size - sizeof(u_char) -			    sizeof(recno_t)))				goto err;			++sp->rptlines[L_CHANGED];			break;		case LOG_MARK:			didop = 1;			memmove(&lm, p + sizeof(u_char), sizeof(LMARK));			m.lno = lm.lno;			m.cno = lm.cno;			if (mark_set(sp, ep, lm.name, &m, 0))				goto err;			break;		default:			abort();		}	}err:	F_CLR(ep, F_NOLOG);	return (1);}/* * Log_setline -- *	Reset the line to its original appearance. * * XXX * There's a bug in this code due to our not logging cursor movements * unless a change was made.  If you do a change, move off the line, * then move back on and do a 'U', the line will be restored to the way * it was before the original change. */intlog_setline(sp, ep)	SCR *sp;	EXF *ep;{	DBT key, data;	LMARK lm;	MARK m;	recno_t lno;	u_char *p;	if (F_ISSET(ep, F_NOLOG)) {		msgq(sp, M_ERR,		    "Logging not being performed, undo not possible.");		return (1);	}	if (ep->l_cur == 1)		return (1);	F_SET(ep, F_NOLOG);		/* Turn off logging. */	key.data = &ep->l_cur;		/* Initialize db request. */	key.size = sizeof(recno_t);	for (;;) {		--ep->l_cur;		if (ep->log->get(ep->log, &key, &data, 0))			LOG_ERR;#if defined(DEBUG) && 0		log_trace(sp, "log_setline", ep->l_cur, data.data);#endif		switch (*(p = (u_char *)data.data)) {		case LOG_CURSOR_INIT:			memmove(&m, p + sizeof(u_char), sizeof(MARK));			if (m.lno != sp->lno || ep->l_cur == 1) {				F_CLR(ep, F_NOLOG);				return (0);			}			break;		case LOG_CURSOR_END:			memmove(&m, p + sizeof(u_char), sizeof(MARK));			if (m.lno != sp->lno) {				++ep->l_cur;				F_CLR(ep, F_NOLOG);				return (0);			}			break;		case LOG_LINE_APPEND:		case LOG_LINE_INSERT:		case LOG_LINE_DELETE:		case LOG_LINE_RESET_F:			break;		case LOG_LINE_RESET_B:			memmove(&lno, p + sizeof(u_char), sizeof(recno_t));			if (lno == sp->lno &&			    file_sline(sp, ep, lno, p + sizeof(u_char) +			    sizeof(recno_t), data.size - sizeof(u_char) -			    sizeof(recno_t)))				goto err;			++sp->rptlines[L_CHANGED];		case LOG_MARK:			memmove(&lm, p + sizeof(u_char), sizeof(LMARK));			m.lno = lm.lno;			m.cno = lm.cno;			if (mark_set(sp, ep, lm.name, &m, 0))				goto err;			break;		default:			abort();		}	}err:	F_CLR(ep, F_NOLOG);	return (1);}/* * Log_forward -- *	Roll the log forward one operation. */intlog_forward(sp, ep, rp)	SCR *sp;	EXF *ep;	MARK *rp;{	DBT key, data;	LMARK lm;	MARK m;	recno_t lno;	int didop;	u_char *p;	if (F_ISSET(ep, F_NOLOG)) {		msgq(sp, M_ERR,		    "Logging not being performed, roll-forward not possible.");		return (1);	}	if (ep->l_cur == ep->l_high) {		msgq(sp, M_BERR, "No changes to re-do.");		return (1);	}	F_SET(ep, F_NOLOG);		/* Turn off logging. */	key.data = &ep->l_cur;		/* Initialize db request. */	key.size = sizeof(recno_t);	for (didop = 0;;) {		++ep->l_cur;		if (ep->log->get(ep->log, &key, &data, 0))			LOG_ERR;#if defined(DEBUG) && 0		log_trace(sp, "log_forward", ep->l_cur, data.data);#endif		switch (*(p = (u_char *)data.data)) {		case LOG_CURSOR_END:			if (didop) {				++ep->l_cur;				memmove(rp, p + sizeof(u_char), sizeof(MARK));				F_CLR(ep, F_NOLOG);				return (0);			}			break;		case LOG_CURSOR_INIT:			break;		case LOG_LINE_APPEND:		case LOG_LINE_INSERT:			didop = 1;			memmove(&lno, p + sizeof(u_char), sizeof(recno_t));			if (file_iline(sp, ep, lno, p + sizeof(u_char) +			    sizeof(recno_t), data.size - sizeof(u_char) -			    sizeof(recno_t)))				goto err;			++sp->rptlines[L_ADDED];			break;		case LOG_LINE_DELETE:			didop = 1;			memmove(&lno, p + sizeof(u_char), sizeof(recno_t));			if (file_dline(sp, ep, lno))				goto err;			++sp->rptlines[L_DELETED];			break;		case LOG_LINE_RESET_B:			break;		case LOG_LINE_RESET_F:			didop = 1;			memmove(&lno, p + sizeof(u_char), sizeof(recno_t));			if (file_sline(sp, ep, lno, p + sizeof(u_char) +			    sizeof(recno_t), data.size - sizeof(u_char) -			    sizeof(recno_t)))				goto err;			++sp->rptlines[L_CHANGED];			break;		case LOG_MARK:			didop = 1;			memmove(&lm, p + sizeof(u_char), sizeof(LMARK));			m.lno = lm.lno;			m.cno = lm.cno;			if (mark_set(sp, ep, lm.name, &m, 0))				goto err;			break;		default:			abort();		}	}err:	F_CLR(ep, F_NOLOG);	return (1);}#if defined(DEBUG) && 0static voidlog_trace(sp, msg, rno, p)	SCR *sp;	char *msg;	recno_t rno;	u_char *p;{	LMARK lm;	MARK m;	recno_t lno;	switch (*p) {	case LOG_CURSOR_INIT:		memmove(&m, p + sizeof(u_char), sizeof(MARK));		TRACE(sp, "%lu: %s:  C_INIT: %u/%u\n", rno, msg, m.lno, m.cno);		break;	case LOG_CURSOR_END:		memmove(&m, p + sizeof(u_char), sizeof(MARK));		TRACE(sp, "%lu: %s:   C_END: %u/%u\n", rno, msg, m.lno, m.cno);		break;	case LOG_LINE_APPEND:		memmove(&lno, p + sizeof(u_char), sizeof(recno_t));		TRACE(sp, "%lu: %s:  APPEND: %lu\n", rno, msg, lno);		break;	case LOG_LINE_INSERT:		memmove(&lno, p + sizeof(u_char), sizeof(recno_t));		TRACE(sp, "%lu: %s:  INSERT: %lu\n", rno, msg, lno);		break;	case LOG_LINE_DELETE:		memmove(&lno, p + sizeof(u_char), sizeof(recno_t));		TRACE(sp, "%lu: %s:  DELETE: %lu\n", rno, msg, lno);		break;	case LOG_LINE_RESET_F:		memmove(&lno, p + sizeof(u_char), sizeof(recno_t));		TRACE(sp, "%lu: %s: RESET_F: %lu\n", rno, msg, lno);		break;	case LOG_LINE_RESET_B:		memmove(&lno, p + sizeof(u_char), sizeof(recno_t));		TRACE(sp, "%lu: %s: RESET_B: %lu\n", rno, msg, lno);		break;	case LOG_MARK:		memmove(&lm, p + sizeof(u_char), sizeof(LMARK));		TRACE(sp,		    "%lu: %s:    MARK: %u/%u\n", rno, msg, lm.lno, lm.cno);		break;	default:		abort();	}}#endif

⌨️ 快捷键说明

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