Blame tests/Performance/Text/TextScroll.c

Packit b099d7
/* $XConsortium: TextScroll.c /main/4 1995/07/15 21:02:31 drk $ */
Packit b099d7
/*
Packit b099d7
 * Motif
Packit b099d7
 *
Packit b099d7
 * Copyright (c) 1987-2012, The Open Group. All rights reserved.
Packit b099d7
 *
Packit b099d7
 * These libraries and programs are free software; you can
Packit b099d7
 * redistribute them and/or modify them under the terms of the GNU
Packit b099d7
 * Lesser General Public License as published by the Free Software
Packit b099d7
 * Foundation; either version 2 of the License, or (at your option)
Packit b099d7
 * any later version.
Packit b099d7
 *
Packit b099d7
 * These libraries and programs are distributed in the hope that
Packit b099d7
 * they will be useful, but WITHOUT ANY WARRANTY; without even the
Packit b099d7
 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
Packit b099d7
 * PURPOSE. See the GNU Lesser General Public License for more
Packit b099d7
 * details.
Packit b099d7
 *
Packit b099d7
 * You should have received a copy of the GNU Lesser General Public
Packit b099d7
 * License along with these librararies and programs; if not, write
Packit b099d7
 * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
Packit b099d7
 * Floor, Boston, MA 02110-1301 USA
Packit b099d7
 */
Packit b099d7
/*
Packit b099d7
 * HISTORY
Packit b099d7
 */
Packit b099d7
Packit b099d7
/*  Standard C headers  */
Packit b099d7
#include <stdio.h>
Packit b099d7
#include <math.h>
Packit b099d7
#include <sys/types.h>
Packit b099d7
#include <sys/stat.h>
Packit b099d7
#include <sys/time.h>
Packit b099d7
Packit b099d7
/*  X headers  */
Packit b099d7
#include <X11/Xlib.h>
Packit b099d7
#include <X11/StringDefs.h>
Packit b099d7
#include <X11/Xatom.h>
Packit b099d7
Packit b099d7
#include <testlib.h>
Packit b099d7
Packit b099d7
#define	NUM_COLUMNS		80
Packit b099d7
#define	NUM_ROWS		24
Packit b099d7
#define	MAX_LINE_LEN	512
Packit b099d7
#define	MAX_NAME_LEN	255
Packit b099d7
Packit b099d7
#define	DEFAULT_IN_FILE1	"./RowCol1_1.c"
Packit b099d7
#define	DEFAULT_IN_FILE2	"./WordWrap.dat"
Packit b099d7
Packit b099d7
#define	TEXT1_X		10
Packit b099d7
#define	TEXT1_Y		10
Packit b099d7
Packit b099d7
Packit b099d7
static void	fill_text_buf();
Packit b099d7
static void  	fillTextCB();
Packit b099d7
static void  	quitCB();
Packit b099d7
static void  	scrollToEndCB();
Packit b099d7
static void  	scrollToBeginCB();
Packit b099d7
static void 	PrintLapseTime();
Packit b099d7
Packit b099d7
Packit b099d7
/*  Global Variables  */
Packit b099d7
Packit b099d7
char infile_name[MAX_NAME_LEN + 1];
Packit b099d7
char *text_string;
Packit b099d7
char *small_text_string = "SMALL TEXT";
Packit b099d7
Packit b099d7
Widget Form1;
Packit b099d7
Widget Text1;
Packit b099d7
Widget fillText;
Packit b099d7
Widget scrollToBegin;
Packit b099d7
Widget scrollToEnd;
Packit b099d7
Packit b099d7
int	total_lines = 0;
Packit b099d7
Boolean show_perf_bug = False;
Packit b099d7
Boolean word_wrap_on = False;
Packit b099d7
Boolean test_word_wrap = False;
Packit b099d7
Packit b099d7
Packit b099d7
XmFontList	newfontlist;
Packit b099d7
XFontStruct	*newfont;
Packit b099d7
Packit b099d7
Arg args[MAX_ARGS];
Packit b099d7
int n;
Packit b099d7
FILE	*in_fp;
Packit b099d7
FILE	*outfp;
Packit b099d7
int		in_fd;
Packit b099d7
Packit b099d7
Packit b099d7
main (argc, argv)
Packit b099d7
int argc;
Packit b099d7
char **argv;
Packit b099d7
{
Packit b099d7
Packit b099d7
	Widget	quit;
Packit b099d7
	char        name[80];
Packit b099d7
Packit b099d7
	struct timeval act_time1, act_time2;
Packit b099d7
	struct timezone zone_time1, zone_time2;
Packit b099d7
Packit b099d7
Packit b099d7
	infile_name[0] = '\0';
Packit b099d7
Packit b099d7
	/*  initialize toolkit  */
Packit b099d7
    CommonTestInit(argc, argv);
Packit b099d7
Packit b099d7
	if (UserData != NULL)
Packit b099d7
		ProcessCommandArgs();
Packit b099d7
Packit b099d7
    sprintf(name, "%s.out", argv[0]);
Packit b099d7
    if ((outfp = fopen(name, "w+")) == NULL) {
Packit b099d7
Packit b099d7
        fprintf(stderr, "Can not open output file %s.out. Trying in /tmp\n",
Packit b099d7
                argv[0]);
Packit b099d7
        sprintf(name, "/tmp/%s.out", argv[0]);
Packit b099d7
        if ((outfp = fopen(name, "w+")) == NULL) {
Packit b099d7
            fprintf(stderr, "Can not open output file /tmp/%s.out. Exiting\n",
Packit b099d7
                    argv[0]);
Packit b099d7
            exit(0);
Packit b099d7
        }
Packit b099d7
Packit b099d7
	}
Packit b099d7
Packit b099d7
    n = 0;
Packit b099d7
	XtSetArg(args[n], XtNwidth, 800);  n++;
Packit b099d7
	XtSetArg(args[n], XtNheight, 500);  n++;
Packit b099d7
    XtSetValues(Shell1, args, n);
Packit b099d7
Packit b099d7
	XtRealizeWidget(Shell1);
Packit b099d7
    
Packit b099d7
Packit b099d7
	/* create main form */
Packit b099d7
	n = 0;
Packit b099d7
	Form1 = XmCreateForm (Shell1, "Form1", args, n);
Packit b099d7
	XtManageChild (Form1);
Packit b099d7
Packit b099d7
	/* Read the text file into a buffer */
Packit b099d7
	fill_text_buf();
Packit b099d7
Packit b099d7
	/* create multi line text widget */
Packit b099d7
	n = 0;
Packit b099d7
	XtSetArg(args[n], XmNx, TEXT1_X); n++;
Packit b099d7
	newfont = XLoadQueryFont(XtDisplay(Shell1),"9x15");
Packit b099d7
	if (newfont != NULL) {
Packit b099d7
		newfontlist = XmFontListCreate(newfont, XmSTRING_DEFAULT_CHARSET);
Packit b099d7
		XtSetArg(args[n], XmNfontList, newfontlist);  n++;
Packit b099d7
	}
Packit b099d7
	XtSetArg(args[n], XmNcolumns, NUM_COLUMNS);  n++;
Packit b099d7
	XtSetArg(args[n], XmNrows, NUM_ROWS);  n++;
Packit b099d7
	XtSetArg(args[n], XmNeditMode, XmMULTI_LINE_EDIT); n++;
Packit b099d7
	XtSetArg(args[n], XmNscrollHorizontal, False); n++;
Packit b099d7
	XtSetArg(args[n], XmNeditable, False); n++;
Packit b099d7
    if (word_wrap_on == True) {
Packit b099d7
		XtSetArg(args[n], XmNwordWrap, True); n++;
Packit b099d7
	}
Packit b099d7
    if (show_perf_bug == True) {
Packit b099d7
    	XtSetArg(args[n], XmNresizeWidth, True); n++;
Packit b099d7
    	XtSetArg(args[n], XmNresizeHeight, True); n++;
Packit b099d7
	}
Packit b099d7
    Text1 = XmCreateScrolledText(Form1, "Text1", args, n);
Packit b099d7
    if (show_perf_bug == True) {
Packit b099d7
Packit b099d7
        gettimeofday(&act_time1, &zone_time1);
Packit b099d7
        XmTextSetString(Text1, text_string);
Packit b099d7
        gettimeofday(&act_time2, &zone_time2);
Packit b099d7
        fprintf(outfp, "Time lapsed to set TextString before Manage : \n");
Packit b099d7
        PrintLapseTime(outfp, &act_time1, &act_time2);
Packit b099d7
Packit b099d7
    }
Packit b099d7
Packit b099d7
	XtManageChild(Text1);
Packit b099d7
Packit b099d7
	n = 0;
Packit b099d7
	XtSetArg(args[n], XmNx, 10); n++;
Packit b099d7
	XtSetArg(args[n], XmNy, TEXT1_Y + 400); n++;
Packit b099d7
	quit = XmCreatePushButtonGadget(Form1, "Quit", args, n);
Packit b099d7
	XtManageChild(quit);
Packit b099d7
	XtAddCallback(quit, XmNactivateCallback, quitCB, NULL);
Packit b099d7
Packit b099d7
	n = 0;
Packit b099d7
	XtSetArg(args[n], XmNx, 150); n++;
Packit b099d7
	XtSetArg(args[n], XmNy, TEXT1_Y + 400); n++;
Packit b099d7
        if (show_perf_bug == True) {
Packit b099d7
                XtSetArg(args[n], XmNsensitive, False); n++;
Packit b099d7
        }
Packit b099d7
	fillText = XmCreatePushButtonGadget(Form1, "Fill Text", args, n);
Packit b099d7
	XtManageChild(fillText);
Packit b099d7
	XtAddCallback(fillText, XmNactivateCallback, fillTextCB, NULL);
Packit b099d7
Packit b099d7
	n = 0;
Packit b099d7
	XtSetArg(args[n], XmNx, 300); n++;
Packit b099d7
	XtSetArg(args[n], XmNy, TEXT1_Y + 400); n++;
Packit b099d7
        if (show_perf_bug == False) {
Packit b099d7
                XtSetArg(args[n], XmNsensitive, False); n++;
Packit b099d7
        }
Packit b099d7
	scrollToEnd = XmCreatePushButtonGadget(Form1, "Scroll To End", args, n);
Packit b099d7
	XtManageChild(scrollToEnd);
Packit b099d7
	XtAddCallback(scrollToEnd, XmNactivateCallback, scrollToEndCB, NULL);
Packit b099d7
Packit b099d7
	n = 0;
Packit b099d7
	XtSetArg(args[n], XmNx, 450); n++;
Packit b099d7
	XtSetArg(args[n], XmNy, TEXT1_Y + 400); n++;
Packit b099d7
        if (show_perf_bug == False) {
Packit b099d7
                XtSetArg(args[n], XmNsensitive, False); n++;
Packit b099d7
        }
Packit b099d7
	scrollToBegin = XmCreatePushButtonGadget(Form1, "Scroll To Begin", args, n);
Packit b099d7
	XtManageChild(scrollToBegin);
Packit b099d7
	XtAddCallback(scrollToBegin, XmNactivateCallback, scrollToBeginCB, NULL);
Packit b099d7
Packit b099d7
	if (word_wrap_on == True)
Packit b099d7
		fprintf(outfp, "wordWrap is ON\n");
Packit b099d7
	else
Packit b099d7
		fprintf(outfp, "wordWrap is OFF\n");
Packit b099d7
Packit b099d7
	XtRealizeWidget(Shell1);
Packit b099d7
Packit b099d7
        CommonPause();
Packit b099d7
        CommonPause();
Packit b099d7
	XtAppMainLoop(app_context);
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
static void PrintLapseTime(fp, first,second)
Packit b099d7
FILE	*fp;
Packit b099d7
struct timeval *first, *second;
Packit b099d7
{
Packit b099d7
     struct timeval lapsed;
Packit b099d7
Packit b099d7
     if (first->tv_usec > second->tv_usec) {
Packit b099d7
        second->tv_usec += 1000000;
Packit b099d7
        second->tv_sec--;
Packit b099d7
     }
Packit b099d7
Packit b099d7
     lapsed.tv_usec = second->tv_usec - first->tv_usec;
Packit b099d7
     lapsed.tv_sec = second->tv_sec - first->tv_sec;
Packit b099d7
Packit b099d7
     fprintf(fp, "lapsed time = %d.%06d sec\n\n",
Packit b099d7
            lapsed.tv_sec, lapsed.tv_usec%1000000);
Packit b099d7
     fflush(fp);
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
static void  quitCB(w, client_data, call_data)
Packit b099d7
Widget	w;
Packit b099d7
caddr_t  client_data;
Packit b099d7
caddr_t  call_data;
Packit b099d7
{
Packit b099d7
Packit b099d7
	int	i;
Packit b099d7
Packit b099d7
	XtFree(text_string);
Packit b099d7
	XtDestroyWidget(Shell1);
Packit b099d7
	fflush(outfp);
Packit b099d7
	fclose(outfp);
Packit b099d7
	exit(0);
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
static void  fillTextCB(w, client_data, call_data)
Packit b099d7
Widget	w;
Packit b099d7
caddr_t  client_data;
Packit b099d7
caddr_t  call_data;
Packit b099d7
{
Packit b099d7
Packit b099d7
	struct timeval act_time1, act_time2;
Packit b099d7
	struct timezone zone_time1, zone_time2;
Packit b099d7
Packit b099d7
Packit b099d7
	if (Text1 == NULL)
Packit b099d7
		return;
Packit b099d7
Packit b099d7
	fprintf(outfp, "Total Number of Lines in the textfile : %d\n\n", 
Packit b099d7
			total_lines);
Packit b099d7
Packit b099d7
	gettimeofday(&act_time1, &zone_time1);
Packit b099d7
	XmTextSetString(Text1, text_string);
Packit b099d7
	gettimeofday(&act_time2, &zone_time2);
Packit b099d7
	fprintf(outfp, "Time lapsed to set TextString : \n");
Packit b099d7
	PrintLapseTime(outfp, &act_time1, &act_time2);
Packit b099d7
Packit b099d7
	n = 0;
Packit b099d7
    XtSetArg(args[n], XmNsensitive, True); n++;
Packit b099d7
	XtSetValues(scrollToEnd, args, n);
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
static void  scrollToEndCB(w, client_data, call_data)
Packit b099d7
Widget	w;
Packit b099d7
caddr_t  client_data;
Packit b099d7
caddr_t  call_data;
Packit b099d7
{
Packit b099d7
Packit b099d7
	struct timeval act_time1, act_time2;
Packit b099d7
	struct timezone zone_time1, zone_time2;
Packit b099d7
Packit b099d7
Packit b099d7
	if (Text1 == NULL)
Packit b099d7
		return;
Packit b099d7
Packit b099d7
	gettimeofday(&act_time1, &zone_time1);
Packit b099d7
	XmTextScroll(Text1, total_lines - NUM_ROWS);
Packit b099d7
	gettimeofday(&act_time2, &zone_time2);
Packit b099d7
	fprintf(outfp, "Time lapsed scrolling to end of textfile : \n");
Packit b099d7
	PrintLapseTime(outfp, &act_time1, &act_time2);
Packit b099d7
Packit b099d7
	n = 0;
Packit b099d7
    XtSetArg(args[n], XmNsensitive, False); n++;
Packit b099d7
	XtSetValues(scrollToEnd, args, n);
Packit b099d7
	n = 0;
Packit b099d7
    XtSetArg(args[n], XmNsensitive, True); n++;
Packit b099d7
	XtSetValues(scrollToBegin, args, n);
Packit b099d7
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
static void  scrollToBeginCB(w, client_data, call_data)
Packit b099d7
Widget	w;
Packit b099d7
caddr_t  client_data;
Packit b099d7
caddr_t  call_data;
Packit b099d7
{
Packit b099d7
Packit b099d7
	struct timeval act_time1, act_time2;
Packit b099d7
	struct timezone zone_time1, zone_time2;
Packit b099d7
Packit b099d7
Packit b099d7
	if (Text1 == NULL)
Packit b099d7
		return;
Packit b099d7
Packit b099d7
	gettimeofday(&act_time1, &zone_time1);
Packit b099d7
	XmTextScroll(Text1, -(total_lines - NUM_ROWS));
Packit b099d7
	gettimeofday(&act_time2, &zone_time2);
Packit b099d7
	fprintf(outfp, "Time lapsed scrolling to beginning of textfile : \n");
Packit b099d7
	PrintLapseTime(outfp, &act_time1, &act_time2);
Packit b099d7
Packit b099d7
	n = 0;
Packit b099d7
    XtSetArg(args[n], XmNsensitive, False); n++;
Packit b099d7
	XtSetValues(scrollToBegin, args, n);
Packit b099d7
	n = 0;
Packit b099d7
    XtSetArg(args[n], XmNsensitive, True); n++;
Packit b099d7
	XtSetValues(scrollToEnd, args, n);
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
static void	fill_text_buf()
Packit b099d7
{
Packit b099d7
Packit b099d7
	struct stat	stat_buf;
Packit b099d7
	int	filesize, bytes_read;
Packit b099d7
	char	line[MAX_LINE_LEN + 1];
Packit b099d7
Packit b099d7
	if (infile_name[0] == '\0')
Packit b099d7
        {
Packit b099d7
            if ( test_word_wrap )
Packit b099d7
		strcpy(infile_name, DEFAULT_IN_FILE2);
Packit b099d7
            else
Packit b099d7
		strcpy(infile_name, DEFAULT_IN_FILE1);
Packit b099d7
        }
Packit b099d7
Packit b099d7
	/* Read the file into a text buffer */
Packit b099d7
	if ((in_fp = fopen(infile_name, "r")) == NULL) {
Packit b099d7
		fprintf(stderr, "Can not open %s\n", infile_name);
Packit b099d7
		exit(0);
Packit b099d7
	}
Packit b099d7
Packit b099d7
	in_fd = fileno(in_fp);
Packit b099d7
	fstat(in_fd, &stat_buf);
Packit b099d7
	filesize = stat_buf.st_size;
Packit b099d7
Packit b099d7
	text_string = (char *)XtMalloc(filesize + 1);
Packit b099d7
	bytes_read = fread(text_string, sizeof(char ), filesize, in_fp);
Packit b099d7
	if (bytes_read != filesize) {
Packit b099d7
		printf("filesize = %d bytes_read = %d\n", filesize, bytes_read);
Packit b099d7
		fclose(in_fp);
Packit b099d7
		exit(0);
Packit b099d7
	}
Packit b099d7
	*(text_string + filesize) = '\0';
Packit b099d7
Packit b099d7
	rewind(in_fp);
Packit b099d7
	while (fgets(line, MAX_LINE_LEN, in_fp) != NULL)
Packit b099d7
		total_lines++;
Packit b099d7
Packit b099d7
	fclose(in_fp);
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7
#define WORD_LEN    32
Packit b099d7
Packit b099d7
ProcessCommandArgs()
Packit b099d7
{
Packit b099d7
Packit b099d7
    char    *user_data;
Packit b099d7
    char    next_word[WORD_LEN + 1];
Packit b099d7
    int     num_spaces;
Packit b099d7
Packit b099d7
    user_data = UserData;
Packit b099d7
Packit b099d7
    while (*user_data != '\0') {
Packit b099d7
Packit b099d7
        get_next_word(user_data, next_word, &num_spaces);
Packit b099d7
        user_data += (strlen(next_word) + num_spaces);
Packit b099d7
Packit b099d7
        if (strcmp(next_word, "-f") == 0) {
Packit b099d7
Packit b099d7
        	get_next_word(user_data, next_word, &num_spaces);
Packit b099d7
        	user_data += (strlen(next_word) + num_spaces);
Packit b099d7
			strcpy(infile_name, next_word);
Packit b099d7
            continue;
Packit b099d7
Packit b099d7
        }
Packit b099d7
		if (strcmp(next_word, "-use_word_wrap") == 0) {
Packit b099d7
			word_wrap_on = True;
Packit b099d7
			continue;
Packit b099d7
		}
Packit b099d7
		if (strcmp(next_word, "-test_word_wrap_on") == 0) {
Packit b099d7
			test_word_wrap = True;
Packit b099d7
			word_wrap_on = True;
Packit b099d7
			continue;
Packit b099d7
		}
Packit b099d7
		if (strcmp(next_word, "-test_word_wrap_off") == 0) {
Packit b099d7
			test_word_wrap = True;
Packit b099d7
			word_wrap_on = False;
Packit b099d7
			continue;
Packit b099d7
		}
Packit b099d7
		if (strcmp(next_word, "-show_perf_bug") == 0) {
Packit b099d7
			show_perf_bug = True;
Packit b099d7
			continue;
Packit b099d7
		}
Packit b099d7
Packit b099d7
    }
Packit b099d7
Packit b099d7
    free(UserData);
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
get_next_word(source, dest, spaces)
Packit b099d7
char    *source;
Packit b099d7
char    *dest;
Packit b099d7
int     *spaces;
Packit b099d7
{
Packit b099d7
Packit b099d7
    int n;
Packit b099d7
    int space_count;
Packit b099d7
Packit b099d7
    space_count = 0;
Packit b099d7
Packit b099d7
    while (isspace(*source)) {
Packit b099d7
        source++;
Packit b099d7
        space_count++;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    n = 0;
Packit b099d7
    while (!isspace(*source) && *source != '\0' && n < WORD_LEN) {
Packit b099d7
        *dest++ = *source++;
Packit b099d7
        n++;
Packit b099d7
    }
Packit b099d7
    *dest = '\0';
Packit b099d7
    *spaces = space_count;
Packit b099d7
Packit b099d7
}