亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? modify.c

?? 操作系統(tǒng)源代碼
?? C
字號:
/* modify.c *//* This file contains the low-level file modification functions: *	delete(frommark, tomark)	- removes line or portions of lines *	add(frommark, text)		- inserts new text *	change(frommark, tomark, text)	- delete, then add */#include "config.h"#include "vi.h"#ifdef DEBUG2# include <stdio.h>static FILE *dbg;/*VARARGS1*/debout(msg, arg1, arg2, arg3, arg4, arg5)	char	*msg, *arg1, *arg2, *arg3, *arg4, *arg5;{	if (!dbg)	{		dbg = fopen("debug.out", "w");		if (!dbg)			return;		setbuf(dbg, (FILE *)0);	}	fprintf(dbg, msg, arg1, arg2, arg3, arg4, arg5);}#endif /* DEBUG2 *//* delete a range of text from the file */void delete(frommark, tomark)	MARK		frommark;	/* first char to be deleted */	MARK		tomark;		/* AFTER last char to be deleted */{	int		i;		/* used to move thru logical blocks */	REG char	*scan;		/* used to scan thru text of the blk */	REG char	*cpy;		/* used when copying chars */	BLK		*blk;		/* a text block */	long		l;		/* a line number */	MARK		m;		/* a traveling version of frommark */#ifdef DEBUG2	debout("delete(%ld.%d, %ld.%d)\n", markline(frommark), markidx(frommark), markline(tomark), markidx(tomark));#endif	/* if not deleting anything, quit now */	if (frommark == tomark)	{		return;	}	/* This is a change */	changes++;	significant = TRUE;	/* supply clues to the redraw module */	redrawrange(markline(frommark), markline(tomark), markline(frommark));	/* adjust marks 'a through 'z and '' as needed */	l = markline(tomark);	for (i = 0; i < NMARKS; i++)	{		if (mark[i] < frommark)		{			continue;		}		else if (mark[i] < tomark)		{			mark[i] = MARK_UNSET;		}		else if (markline(mark[i]) == l)		{			if (markline(frommark) == l)			{				mark[i] -= markidx(tomark) - markidx(frommark);			}			else			{				mark[i] -= markidx(tomark);			}		}		else		{			mark[i] -= MARK_AT_LINE(l - markline(frommark));		}	}	/* Reporting... */	if (markidx(frommark) == 0 && markidx(tomark) == 0)	{		rptlines = markline(tomark) - markline(frommark);		rptlabel = "deleted";	}	/* find the block containing frommark */	l = markline(frommark);	for (i = 1; lnum[i] < l; i++)	{	}	/* process each affected block... */	for (m = frommark;	     m < tomark && lnum[i] < INFINITY;	     m = MARK_AT_LINE(lnum[i - 1] + 1))	{		/* fetch the block */		blk = blkget(i);		/* find the mark in the block */		scan = blk->c;		for (l = markline(m) - lnum[i - 1] - 1; l > 0; l--)		{			while (*scan++ != '\n')			{			}		}		scan += markidx(m);		/* figure out where the changes to this block end */		if (markline(tomark) > lnum[i])		{			cpy = blk->c + BLKSIZE;		}		else if (markline(tomark) == markline(m))		{			cpy = scan - markidx(m) + markidx(tomark);		}		else		{			cpy = scan;			for (l = markline(tomark) - markline(m);			     l > 0;			     l--)			{				while (*cpy++ != '\n')				{				}			}			cpy += markidx(tomark);		}		/* delete the stuff by moving chars within this block */		while (cpy < blk->c + BLKSIZE)		{			*scan++ = *cpy++;		}		while (scan < blk->c + BLKSIZE)		{			*scan++ = '\0';		}		/* adjust tomark to allow for lines deleted from this block */		tomark -= MARK_AT_LINE(lnum[i] + 1 - markline(m));		/* if this block isn't empty now, then advance i */		if (*blk->c)		{			i++;		}		/* the buffer has changed.  Update hdr and lnum. */		blkdirty(blk);	}	/* must have at least 1 line */	if (nlines == 0)	{		blk = blkadd(1);		blk->c[0] = '\n';		blkdirty(blk);		cursor = MARK_FIRST;	}}/* add some text at a specific place in the file */void add(atmark, newtext)	MARK		atmark;		/* where to insert the new text */	char		*newtext;	/* NUL-terminated string to insert */{	REG char	*scan;		/* used to move through string */	REG char	*build;		/* used while copying chars */	int		addlines;	/* number of lines we're adding */	int		lastpart;	/* size of last partial line */	BLK		*blk;		/* the block to be modified */	int		blkno;		/* the logical block# of (*blk) */	REG char	*newptr;	/* where new text starts in blk */	BLK		buf;		/* holds chars from orig blk */	BLK		linebuf;	/* holds part of line that didn't fit */	BLK		*following;	/* the BLK following the last BLK */	int		i;	long		l;#ifdef DEBUG2	debout("add(%ld.%d, \"%s\")\n", markline(atmark), markidx(atmark), newtext);#endif#ifdef lint	buf.c[0] = 0;#endif	/* if not adding anything, return now */	if (!*newtext)	{		return;	}	/* This is a change */	changes++;	significant = TRUE;	/* count the number of lines in the new text */	for (scan = newtext, lastpart = addlines = 0; *scan; )	{		if (*scan++ == '\n')		{			addlines++;			lastpart = 0;		}		else		{			lastpart++;		}	}	/* Reporting... */	if (lastpart == 0 && markidx(atmark) == 0)	{		rptlines = addlines;		rptlabel = "added";	}	/* extract the line# from atmark */	l = markline(atmark);	/* supply clues to the redraw module */	if ((markidx(atmark) == 0 && lastpart == 0) || addlines == 0)	{		redrawrange(l, l, l + addlines);	}	else	{		/* make sure the last line gets redrawn -- it was		 * split, so its appearance has changed		 */		redrawrange(l, l + 1L, l + addlines + 1L);	}	/* adjust marks 'a through 'z and '' as needed */	for (i = 0; i < NMARKS; i++)	{		if (mark[i] < atmark)		{			/* earlier line, or earlier in same line: no change */			continue;		}		else if (markline(mark[i]) > l)		{			/* later line: move down a whole number of lines */			mark[i] += MARK_AT_LINE(addlines);		}		else		{			/* later in same line */			if (addlines > 0)			{				/* multi-line add, which split this line:				 * move down, and possibly left or right,				 * depending on where the split was and how				 * much text was inserted after the last \n				 */				mark[i] += MARK_AT_LINE(addlines) + lastpart - markidx(atmark);			}			else			{				/* totally within this line: move right */				mark[i] += lastpart;			}		}	}	/* get the block to be modified */	for (blkno = 1; lnum[blkno] < l && lnum[blkno + 1] < INFINITY; blkno++)	{	}	blk = blkget(blkno);	buf = *blk;	/* figure out where the new text starts */	for (newptr = buf.c, l = markline(atmark) - lnum[blkno - 1] - 1;	     l > 0;	     l--)	{		while (*newptr++ != '\n')		{		}	}	newptr += markidx(atmark);	/* keep start of old block */	build = blk->c + (int)(newptr - buf.c);	/* fill this block (or blocks) from the newtext string */	while (*newtext)	{		while (*newtext && build < blk->c + BLKSIZE - 1)		{			*build++ = *newtext++;		}		if (*newtext)		{			/* save the excess */			for (scan = linebuf.c + BLKSIZE;			     build > blk->c && build[-1] != '\n';			     )			{				*--scan = *--build;			}			/* write the block */			while (build < blk->c + BLKSIZE)			{				*build++ = '\0';			}			blkdirty(blk);			/* add another block */			blkno++;			blk = blkadd(blkno);			/* copy in the excess from last time */			for (build = blk->c; scan < linebuf.c + BLKSIZE; )			{				*build++ = *scan++;			}		}	}	/* fill this block(s) from remainder of orig block */	while (newptr < buf.c + BLKSIZE && *newptr)	{		while (newptr < buf.c + BLKSIZE		    && *newptr		    && build < blk->c + BLKSIZE - 1)		{			*build++ = *newptr++;		}		if (newptr < buf.c + BLKSIZE && *newptr)		{			/* save the excess */			for (scan = linebuf.c + BLKSIZE;			     build > blk->c && build[-1] != '\n';			     )			{				*--scan = *--build;			}			/* write the block */			while (build < blk->c + BLKSIZE)			{				*build++ = '\0';			}			blkdirty(blk);			/* add another block */			blkno++;			blk = blkadd(blkno);			/* copy in the excess from last time */			for (build = blk->c; scan < linebuf.c + BLKSIZE; )			{				*build++ = *scan++;			}		}	}	/* see if we can combine our last block with the following block */	if (lnum[blkno] < nlines && lnum[blkno + 1] - lnum[blkno] < (BLKSIZE >> 6))	{		/* hey, we probably can!  Get the following block & see... */		following = blkget(blkno + 1);		if (strlen(following->c) + (build - blk->c) < BLKSIZE - 1)		{			/* we can!  Copy text from following to blk */			for (scan = following->c; *scan; )			{				*build++ = *scan++;			}			while (build < blk->c + BLKSIZE)			{				*build++ = '\0';			}			blkdirty(blk);			/* pretend the following was the last blk */			blk = following;			build = blk->c;		}	}	/* that last block is dirty by now */	while (build < blk->c + BLKSIZE)	{		*build++ = '\0';	}	blkdirty(blk);}/* change the text of a file */void change(frommark, tomark, newtext)	MARK	frommark, tomark;	char	*newtext;{	int	i;	long	l;	char	*text;	BLK	*blk;#ifdef DEBUG2	debout("change(%ld.%d, %ld.%d, \"%s\")\n", markline(frommark), markidx(frommark), markline(tomark), markidx(tomark), newtext);#endif	/* optimize for single-character replacement */	if (frommark + 1 == tomark && newtext[0] && !newtext[1] && newtext[0] != '\n')	{		/* find the block containing frommark */		l = markline(frommark);		for (i = 1; lnum[i] < l; i++)		{		}		/* get the block */		blk = blkget(i);		/* find the line within the block */		for (text = blk->c, i = l - lnum[i - 1] - 1; i > 0; text++)		{			if (*text == '\n')			{				i--;			}		}		/* replace the char */		text += markidx(frommark);		if (*text == newtext[0])		{			/* no change was needed - same char */			return;		}		else if (*text != '\n')		{			/* This is a change */			changes++;			significant = TRUE;			ChangeText			{				*text = newtext[0];				blkdirty(blk);			}			redrawrange(markline(frommark), markline(tomark), markline(frommark));			return;		}		/* else it is a complex change involving newline... */	}	/* couldn't optimize, so do delete & add */	ChangeText	{		delete(frommark, tomark);		add(frommark, newtext);		rptlabel = "changed";	}}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产乱妇无码大片在线观看| 亚洲免费在线播放| 美女久久久精品| 精品日韩99亚洲| 国产盗摄一区二区| 亚洲视频电影在线| 欧美性极品少妇| 日本va欧美va精品发布| 日韩精品在线一区二区| 国产成人亚洲综合a∨婷婷| 国产精品久久久久aaaa樱花| 色先锋资源久久综合| 亚洲成人福利片| 久久蜜桃一区二区| 97国产精品videossex| 亚洲大片免费看| 久久综合色婷婷| 色94色欧美sute亚洲线路二 | 欧美综合一区二区| 日韩精品福利网| 久久精品亚洲一区二区三区浴池| 不卡av免费在线观看| 亚洲国产美国国产综合一区二区| 日韩免费成人网| av电影天堂一区二区在线| 亚洲成av人**亚洲成av**| www国产成人免费观看视频 深夜成人网| 成人白浆超碰人人人人| 一区二区成人在线观看| 久久久久成人黄色影片| 欧美羞羞免费网站| 国产成人h网站| 蜜臀精品久久久久久蜜臀| 综合久久综合久久| 精品嫩草影院久久| 欧美亚洲自拍偷拍| 不卡av免费在线观看| 麻豆91在线看| 亚洲国产aⅴ成人精品无吗| 国产亚洲成av人在线观看导航| 欧美三级电影网| 成人一二三区视频| 麻豆极品一区二区三区| 亚洲综合av网| 中文字幕日韩精品一区| 久久久午夜精品理论片中文字幕| 欧美日韩国产精选| 99精品热视频| 国产成人综合亚洲91猫咪| 日韩国产在线观看一区| 综合色天天鬼久久鬼色| 中文字幕精品—区二区四季| 51精品国自产在线| 欧美在线高清视频| 色综合天天狠狠| 成人性视频免费网站| 精品一区二区三区在线观看| 亚洲成人av一区二区| 亚洲精品成人天堂一二三| 国产精品高潮呻吟| 国产日韩欧美高清在线| 精品国产网站在线观看| 欧美一区二区三区精品| 宅男在线国产精品| 欧美日韩中文字幕一区二区| 日本电影欧美片| 色悠悠久久综合| 91污片在线观看| 一本一道久久a久久精品综合蜜臀| 成人午夜电影久久影院| 国产成人av一区二区三区在线观看| 老司机精品视频在线| 另类小说色综合网站| 麻豆一区二区在线| 久久精品国产秦先生| 另类欧美日韩国产在线| 六月丁香婷婷久久| 国产精品一级二级三级| 精品一区二区在线看| 国产伦精品一区二区三区免费 | 欧美日本精品一区二区三区| 欧美伊人久久大香线蕉综合69 | 色狠狠av一区二区三区| 色嗨嗨av一区二区三区| 欧美中文字幕一区| 欧美精品aⅴ在线视频| 欧美一区二区三区免费在线看| 精品久久久久久综合日本欧美| 久久久久久免费毛片精品| 欧美激情在线观看视频免费| 中文字幕一区av| 亚洲综合色网站| 秋霞影院一区二区| 国产成人在线视频播放| 色呦呦网站一区| 欧美日韩国产成人在线91| 日韩一级二级三级精品视频| 精品久久久久香蕉网| 中文字幕一区二区三区色视频| 悠悠色在线精品| 麻豆国产精品官网| 成人精品一区二区三区四区 | 色综合久久天天综合网| 5566中文字幕一区二区电影| 精品国产三级a在线观看| 国产精品乱码妇女bbbb| 一区二区三区欧美| 久久精品99久久久| 成人网在线免费视频| 欧美日韩国产在线观看| 久久品道一品道久久精品| 亚洲精品菠萝久久久久久久| 午夜欧美视频在线观看| 国产精品18久久久久久久久 | 久久久久综合网| 亚洲色图.com| 免费精品视频最新在线| jvid福利写真一区二区三区| 91精品在线一区二区| 国产精品福利一区二区三区| 日韩av电影免费观看高清完整版| 狠狠久久亚洲欧美| 欧美丝袜自拍制服另类| 国产人伦精品一区二区| 天涯成人国产亚洲精品一区av| 国产精品99久久久久久似苏梦涵 | 亚洲免费观看高清在线观看| 日韩成人精品在线| 91视频免费看| 久久女同精品一区二区| 亚洲成人免费在线| 99久久精品免费看| 久久久久亚洲综合| 日韩成人一区二区| 欧美色图天堂网| 国产精品国产三级国产三级人妇| 蜜桃视频一区二区三区在线观看| 日本高清成人免费播放| 国产精品网曝门| 国产另类ts人妖一区二区| 欧美丰满一区二区免费视频| 一区二区三区蜜桃| 99麻豆久久久国产精品免费| 日韩精品一区二区三区视频播放| 亚洲成人精品在线观看| 91国产福利在线| 亚洲天堂中文字幕| 成人影视亚洲图片在线| 久久久久久久精| 精品一区二区三区日韩| 91精品久久久久久久99蜜桃| 亚洲制服丝袜av| 99精品视频中文字幕| 中文字幕在线观看一区| 国产精品一区不卡| 国产亚洲一本大道中文在线| 国产在线不卡一区| 欧美不卡一区二区三区| 免费成人av在线播放| 日韩三级伦理片妻子的秘密按摩| 亚洲福利一二三区| 欧美三电影在线| 亚洲国产欧美在线| 欧美精品色综合| 日韩 欧美一区二区三区| 欧美日韩精品免费| 五月天欧美精品| 91麻豆精品国产91久久久| 爽爽淫人综合网网站| 日韩欧美中文字幕公布| 精品亚洲aⅴ乱码一区二区三区| 日韩免费高清av| 韩国一区二区视频| 中文字幕欧美区| 91麻豆国产在线观看| 亚洲黄色av一区| 欧美电影在哪看比较好| 蜜臀精品一区二区三区在线观看 | 91亚洲精品一区二区乱码| 亚洲欧洲国产日韩| 在线一区二区三区| 石原莉奈在线亚洲二区| 欧美电视剧在线观看完整版| 国产精品一二三区| 亚洲精品一二三| 91精品国产综合久久精品app| 麻豆专区一区二区三区四区五区| 久久久午夜精品| 91蜜桃网址入口| 午夜欧美电影在线观看| 久久美女艺术照精彩视频福利播放| 成人午夜精品一区二区三区| 亚洲精品大片www| 欧美电影免费观看高清完整版在线观看| 国产一区二区免费在线| 最新日韩av在线| 欧美一区午夜视频在线观看| 国产成人精品综合在线观看 | 91香蕉国产在线观看软件| 天天爽夜夜爽夜夜爽精品视频|