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

📄 multislice.c

📁 一个很不错的程序切片工具,希望大家来讨论以下,对测试人员很有帮助
💻 C
📖 第 1 页 / 共 2 页
字号:
	*/	Nvisible = 0.5 + w->core.height/((float)h);	LastLine = w->slicetext.top + Nvisible;	if (LastLine > w->slicetext.slicesrc.n_lines){		LastLine = w->slicetext.slicesrc.n_lines;		FirstLine = w->slicetext.slicesrc.n_lines - Nvisible + 1;	}	else FirstLine = w->slicetext.top;	if (FirstLine < 1) FirstLine = 1;	if (FirstLine != w->slicetext.top) w->slicetext.top = FirstLine;	if(DEBUG) printf ("Expose %d lines %d - %d\n",Nvisible,FirstLine,LastLine);	sprintf (format," %%%dd ",w->slicetext.log);	lineoffset = (w->slicetext.log + 3)*		w->slicetext.font->max_bounds.width;	for (line = FirstLine; line <= LastLine; line++){		/*	if (DEBUG)printf ("Expose %d\n",turn);	if (DEBUG)fflush(stdout);		if (DEBUG)printf ("Line %d\n",line); fflush(stdout);		*/		sprintf (line_no,format,adjust_line(w,line));		if (w->slicetext.slicesrc.line[line].n_highlight)		 	 gc_to_use = w->slicetext.alt_gc;		else gc_to_use = w->slicetext.gc;		 XClearArea (e->display,e->window,			0,base-ascent,0,h,False);		 XDrawImageString (e->display,e->window,gc_to_use,			w->slicetext.font->max_bounds.width,			base,line_no,			w->slicetext.log + 2			);/*static void buildline (buff,line,n,tabstop)		 XDrawImageString (e->display,e->window,gc_to_use,			lineoffset,base,w->slicetext.slicesrc.line[line].text,			w->slicetext.slicesrc.line[line].length			);*/		buildline (line_buff,w->slicetext.slicesrc.line[line].text,			w->slicetext.slicesrc.line[line].length,			w->slicetext.tabstop,linemap);		 drawline (e->display,e->window,			w, line_buff, lineoffset,base,line,linemap		 );		 /* *********************************		 XDrawImageString (e->display,e->window,gc_to_use,			lineoffset,base,line_buff,			strlen(line_buff)			);			*********************************** */		base += h;	}	XClearArea (e->display,e->window,			0,base-ascent,0,0,False);	XCopyArea (e->display,w->slicetext.sidebar,e->window,		w->slicetext.side_gc,0,0,		w->slicetext.side_width,w->core.height,		w->core.width-w->slicetext.side_width,0);}side_set (w,line_from)	int		line_from;	MultiSliceWidget	w;{	int		ix,at,h;	h = (w->core.height)/(w->slicetext.slicesrc.n_lines) - 1;	h = h < 1? 1 : h;	at = ((line_from-1)*w->core.height)/(w->slicetext.slicesrc.n_lines);	for (ix = 0; ix < h; ix++,at++)		XDrawLine(XtDisplay(w),w->slicetext.sidebar,			w->slicetext.side_gc,0,at,100,at);}static void SliceResize (w)	MultiSliceWidget	w;{		float	top,shown;	int		win,line;	if (!w->slicetext.slicesrc.n_lines) return;	win = (0.5) + ((float) w->core.height)/		( w->slicetext.font->ascent + w->slicetext.font->descent);	shown = ((float)win)/((float) w->slicetext.slicesrc.n_lines);	top = (w->slicetext.top - 1)/((float)w->slicetext.slicesrc.n_lines);	if(DEBUG) printf ("h %d a %d d %d   ",		 w->core.height,		w->slicetext.font->ascent,w->slicetext.font->descent);	if(DEBUG) printf ("win %d  file %d  shown %f\n",		win,w->slicetext.slicesrc.n_lines,shown);	if (w->slicetext.scrollbar == NULL) return;	XawScrollbarSetThumb (w->slicetext.scrollbar,top,shown);	/*	w->slicetext.top = 1;		w->slicetext.slicesrc.line[line].n_highlight = 0;	*/	XFillRectangle (XtDisplay(w),w->slicetext.sidebar,		w->slicetext.side_clear_gc,0,0,w->slicetext.side_width,		DisplayHeight(XtDisplay(w),			DefaultScreen(XtDisplay(w))));	for (line = 1; line <=w->slicetext.slicesrc.n_lines;line++)		if (w->slicetext.slicesrc.line[line].n_highlight)			side_set (w,line);}SliceSetTop (w,pc)	float		pc;	MultiSliceWidget	w;{	int		line;	int		old_top;	old_top = w->slicetext.top;	if(DEBUG) printf ("Setting Top line %f\n",pc);	w->slicetext.top = (int)( w->slicetext.slicesrc.n_lines*pc);	if ((pc < 0.0) || (pc > 1.0))w->slicetext.top = 1;	if (w->slicetext.top != old_top){		XawScrollbarSetThumb (w->slicetext.scrollbar,pc,-1.0);		fakeexpose (w);	}}SliceRedraw (w)	MultiSliceWidget	w;{	fakeexpose (w);}SliceSet (w,line_from,col_from,line_to,col_to,redraw)	int		line_from,col_from,line_to,col_to,redraw;	MultiSliceWidget	w;{	int		line,ix,at,h;	ix = w->slicetext.slicesrc.line[line_from].n_highlight;	if (ix+5 > MAXHL) return;	ix = w->slicetext.slicesrc.line[line_to].n_highlight;	if (ix+5 > MAXHL) return;	if(DEBUG) printf ("Setting line %d\n",line);	if (DEBUG)printf ("Set (%d,%d)--(%d,%d) <%d>",			line_from,col_from,line_to,col_to,			w->slicetext.slicesrc.line[line_from].length);	if (line_from != line_to){		for (line = line_from; line <= line_to; line++)			if ((line <= w->slicetext.slicesrc.n_lines) && (line > 0)){				ix = w->slicetext.slicesrc.line[line].n_highlight;				if (ix+5 < MAXHL)					w->slicetext.slicesrc.line[line].n_highlight++;				w->slicetext.slicesrc.line[line].start[ix] = 0;				w->slicetext.slicesrc.line[line].stop[ix] = 0;			}			line = line_from;			ix = w->slicetext.slicesrc.line[line].n_highlight - 1;			w->slicetext.slicesrc.line[line].start[ix] = col_from;			line = line_to;			ix = w->slicetext.slicesrc.line[line].n_highlight - 1;			w->slicetext.slicesrc.line[line].stop[ix] = col_to;		}		else {			line = line_from;			ix = w->slicetext.slicesrc.line[line].n_highlight;			if (ix < MAXHL)				w->slicetext.slicesrc.line[line].n_highlight++;			w->slicetext.slicesrc.line[line].start[ix] = col_from;			w->slicetext.slicesrc.line[line].stop[ix] = col_to;			if (DEBUG)printf (" Same line");		}	if (DEBUG)printf ("\n");	side_set (w,line_from);	if(redraw)fakeexpose (w);}SliceClearAll(w)	MultiSliceWidget	w;{	int		line;	if(DEBUG) printf ("Clear %d lines\n",w->slicetext.slicesrc.n_lines);		for (line = 1; line <= w->slicetext.slicesrc.n_lines; line++){		if(DEBUG) printf ("Clear Line %d\n",line); fflush(stdout);		w->slicetext.slicesrc.line[line].n_highlight = 0;	}	XFillRectangle (XtDisplay(w),w->slicetext.sidebar,		w->slicetext.side_clear_gc,0,0,w->slicetext.side_width,		DisplayHeight(XtDisplay(w),			DefaultScreen(XtDisplay(w))));	fakeexpose (w);}void MultiSliceSetHook(w,h)	void (*h)();	MultiSliceWidget	w;{	w->slicetext.hook = h;}find_line_and_file (w,line,fid,line_in_file)	int	line,*fid,*line_in_file;	MultiSliceWidget w;{	int	*off,i;	off = w->slicetext.slicesrc.offset;	if (line > off[w->slicetext.slicesrc.n_files])		line = off[w->slicetext.slicesrc.n_files];	for (i = 1; i < w->slicetext.slicesrc.n_files ; i++){		if (off[i] >= line){			*fid = i - 1;			*line_in_file = line - off[i-1];			return;		}	}	*fid = w->slicetext.slicesrc.n_files-1;	*line_in_file = line - off[w->slicetext.slicesrc.n_files - 1];	return;}static void MultiSliceHook( w,event,parm,n)	MultiSliceWidget	w;	XEvent* event;	String* parm;	Cardinal* n;{	static	int	line = 0;	int		y;	int		fid,f_line,nf;	if(DEBUG)printf ("event %d buttonrelease (%d) kdn/up(%d %d)\n",		event->type, ButtonRelease,KeyPress,KeyRelease);	if (event->type == ButtonRelease) y = event->xbutton.y;	else if ((event->type == KeyRelease) || 		 (event->type == KeyPress)) y = event->xkey.y;	else return;	line = w->slicetext.top + y/(w->slicetext.font->ascent +		w->slicetext.font->descent);	if(DEBUG)printf ("y (%d) line (%d)\n",y,line);	find_line_and_file (w,line,&fid,&f_line);	printf ("Click on line %d of display (%d of fid %d)\n",		line,f_line,fid);	if (w->slicetext.hook){		(*w->slicetext.hook)(fid,f_line);	}}static void MultiSliceSelect( w,event,parm,n)	MultiSliceWidget	w;	XEvent* event;	String* parm;	Cardinal* n;{	static	int	line = 0;	static	MultiSliceReturn r;	int		y;	if (event->type == ButtonRelease) y = event->xbutton.y;	else if ((event->type == KeyRelease) || 		 (event->type == KeyPress)) y = event->xkey.y;	else y = 1;	line = w->slicetext.top + y/(w->slicetext.font->ascent +		w->slicetext.font->descent);	if(DEBUG)printf ("y (%d) line (%d)\n",y,line);	r.line = line;	if (*n == 0) r.message = NULL;	else r.message = parm[0];	if (event->xbutton.x >= (w->core.width - w->slicetext.side_width)){		SliceSetTop (w,			((float)y)/((float)(w->core.height?w->core.height:1)));	}	else XtCallCallbacks((Widget)w,XtNcallback,(XtPointer)&r);}static void MultiSliceAction( w,event,parm,n)	MultiSliceWidget	w;	XEvent* event;	String* parm;	Cardinal* n;{	static	int	line = 0;	int		y;	if(DEBUG)printf ("event %d buttonrelease (%d) kdn/up(%d %d)\n",		event->type, ButtonRelease,KeyPress,KeyRelease);	if (event->type == ButtonRelease) y = event->xbutton.y;	else if ((event->type == KeyRelease) || 		 (event->type == KeyPress)) y = event->xkey.y;	else return;	line = w->slicetext.top + y/(w->slicetext.font->ascent +		w->slicetext.font->descent);	if(DEBUG)printf ("y (%d) line (%d)\n",y,line);	SliceSet (w,line,0,line,0,True);}static XtActionsRec actions[] ={    {"slicetexthook",    	MultiSliceHook},    {"setslicetext",    	MultiSliceAction},    {"selectslicetext",		MultiSliceSelect},};static char translations[] ="<Btn3Up>:     setslicetext()  \n\ <Btn2Up>:     selectslicetext(\"dice\")  \n\ None<Btn1Up>:     selectslicetext()  \n\ Shift<Btn1Up>:     slicetexthook()  \n\";MultiSliceClassRec multisliceClassRec = {  { /* core fields */    /* superclass       */  (WidgetClass) &widgetClassRec,    /* class_name       */  "MultiSlice",    /* widget_size      */  sizeof(MultiSliceRec),    /* class_initialize     */  NULL,    /* class_part_initialize    */  NULL,    /* class_inited     */  FALSE,    /* initialize       */  doinit,    /* initialize_hook      */  NULL,    /* realize          */  XtInheritRealize,    /* actions          */  actions,    /* num_actions      */  XtNumber(actions),    /* resources        */  resources,    /* num_resources        */  XtNumber(resources),    /* xrm_class        */  NULLQUARK,    /* compress_motion      */  TRUE,    /* compress_exposure    */  TRUE,    /* compress_enterleave  */  TRUE,    /* visible_interest     */  FALSE,    /* destroy          */  NULL,    /* resize           */  SliceResize,    /* expose           */  doexpose,    /* set_values       */  NULL,    /* set_values_hook      */  NULL,    /* set_values_almost    */  XtInheritSetValuesAlmost,    /* get_values_hook      */  NULL,    /* accept_focus     */  NULL,    /* version          */  XtVersion,    /* callback_private     */  NULL,    /* tm_table         */  translations,    /* query_geometry       */  XtInheritQueryGeometry,    /* display_accelerator  */  XtInheritDisplayAccelerator,    /* extension        */  NULL  },  { /* slicetext fields */    /* empty            */  0  }};WidgetClass multisliceWidgetClass = (WidgetClass)&multisliceClassRec;BuildSliceSrc (w,n,f,nlines)	MultiSliceWidget	w;	MultiSliceFilesPtr	f;	int					n;	int			nlines;{	char		*string;	int			at_line = 1;	char		*old,*at;	int			longest_line = 0,lines;	SliceSrc	*src;	int			i;	if(DEBUG) printf ("Build %d lines\n",nlines);	src = &w->slicetext.slicesrc;	src->n_lines = 0;	src->line = (Line *) malloc ((nlines+2)*sizeof(Line));	if (src->line == NULL){		fprintf (stderr,"Not enough memory for %d lines\n",nlines);		exit (1);	}	src->n_files = n;	src->offset = (int *) malloc((n+1)*sizeof(int));	if (src->offset == NULL){		fprintf (stderr,"Not enough memory for %d lines\n",nlines);		exit (1);	}	src->n_files = n;	for (i = 0; i < n; i++){		at = f[i].text;		src->offset[i] = at_line - 1;		if (!at) return;		while (*at){			src->line[at_line].text = at;			src->line[at_line].n_highlight = 0;			old = at;			while ((*at != '\0') && (*at != '\n'))at++;			src->line[at_line].length = at-old;			if (src->line[at_line].length > longest_line)				longest_line = src->line[at_line].length;			src->n_lines++;			at_line++;			if(*at)at++;		}	}	src->offset[n] = at_line - 1;	src->longest = longest_line;	lines = src->n_lines;	w->slicetext.log = 0;	while (lines > 0){		lines = lines/10;		w->slicetext.log++;	}	SliceResize (w);	if(DEBUG) printf (" %d lines, longest %d\n",src->n_lines,longest_line);	if (longest_line >= Max_line_length){		fprintf (stderr,"Longest line %d is too long (limit %d)\n",			longest_line,Max_line_length);		exit(1);	}}PrintSliceSrc (w)	MultiSliceWidget	w;{	int		i,l;	char	*at;	SliceSrc	*src;	src = &w->slicetext.slicesrc;	if(DEBUG)printf ("%d lines, longest is %d\n",		src->n_lines,src->longest);	for ( i = 1; i <= src->n_lines; i++){		at = src->line[i].text;		for (l = 0; l < src->line[i].length; l++)			if (DEBUG)printf ("%c",*at++);		if(DEBUG)printf ("\n");	}}

⌨️ 快捷键说明

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