summaryrefslogtreecommitdiff
path: root/ACE/apps/JAWS/clients/WebSTONE/src/parse_file_list.c
diff options
context:
space:
mode:
Diffstat (limited to 'ACE/apps/JAWS/clients/WebSTONE/src/parse_file_list.c')
-rw-r--r--ACE/apps/JAWS/clients/WebSTONE/src/parse_file_list.c290
1 files changed, 290 insertions, 0 deletions
diff --git a/ACE/apps/JAWS/clients/WebSTONE/src/parse_file_list.c b/ACE/apps/JAWS/clients/WebSTONE/src/parse_file_list.c
new file mode 100644
index 00000000000..e201c51d4db
--- /dev/null
+++ b/ACE/apps/JAWS/clients/WebSTONE/src/parse_file_list.c
@@ -0,0 +1,290 @@
+/* $Id$ */
+/**************************************************************************
+ * *
+ * Copyright (C) 1995 Silicon Graphics, Inc. *
+ * *
+ * These coded instructions, statements, and computer programs were *
+ * developed by SGI for public use. If any changes are made to this code*
+ * please try to get the changes back to the author. Feel free to make *
+ * modifications and changes to the code and release it. *
+ * *
+ **************************************************************************/
+#include <stdio.h>
+#include <errno.h>
+#include <signal.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifndef WIN32
+#include <netdb.h>
+#include <sys/param.h>
+#endif /* WIN32 */
+
+#include <sys/types.h>
+
+#ifndef WIN32
+#include <sys/ipc.h>
+#include <sys/shm.h>
+#include <sys/errno.h>
+#include <sys/socket.h>
+#include <sys/time.h>
+#include <netinet/in.h>
+#else
+#include <windows.h>
+#include <process.h>
+#include <time.h>
+#include <winsock.h>
+#endif /* WIN32 */
+
+#include <ctype.h>
+
+#include "sysdep.h"
+#include "bench.h"
+
+
+/*
+ * count_file_list()
+ * given a filename, return a guess at the number of pages
+ */
+int
+count_file_list(const char *url_list_file)
+{
+ FILE *fp;
+ long int num_of_pages;
+ char a_line[BUFSIZ];
+ char *textvalue;
+ int returnval;
+
+ fp = fopen(url_list_file, "r");
+
+ if (fp == NULL)
+ {
+ D_PRINTF( "Error %d opening filelist %s: %s\n",
+ errno, url_list_file, strerror(errno) );;
+ return(returnerr("Error %d opening filelist %s: %s\n",
+ errno, url_list_file, strerror(errno)));
+ }
+ else
+ {
+ num_of_pages = 0;
+ D_PRINTF( "Opened file, about to count\n" );
+ /*
+ * parse through the file line-by-line
+ * strip out comments, but don't check for URL consistency
+ */
+ while (fgets(a_line, BUFSIZ, fp) != NULL)
+ {
+ textvalue = a_line;
+ /* check for comments */
+ if (strchr(textvalue, '#') != NULL)
+ {
+ /* throw out anything after any '#' */
+ D_PRINTF( "Stripping comment from line: %s\n", textvalue );
+ returnval = strcspn(textvalue, "#");
+ D_PRINTF( "Found first # at %d\n", returnval );
+ if (returnval == 0)
+ {
+ textvalue = NULL;
+ }
+ }
+ /* is there more? */
+ if (textvalue != NULL)
+ {
+ num_of_pages++;
+ D_PRINTF( "Found %ld pages\n", num_of_pages );
+ }
+ }
+ return(num_of_pages);
+ }
+ fclose(fp);
+} /* end count_file_list() */
+
+/*
+ * parse_file_list()
+ * given a filename, a pointer to a page list, and pointers to integers
+ * for the number of pages and the number of files, parse its contents.
+ */
+void
+parse_file_list (const char *url_list_file, page_list_t *page_list,
+ long int *num_of_pages, long int *num_of_files)
+{
+ FILE *fp;
+ int filenum;
+ int returnval;
+ int loadnum;
+ char a_line[BUFSIZ];
+ char tempbuf[BUFSIZ];
+ char *textvalue;
+ int numfiles = 1, numpages = 0;
+ int maxpages = *num_of_pages;
+ page_list_t *pp;
+
+ extern int haveproxyserver;
+
+ fp = fopen(url_list_file, "r");
+
+ if (fp == NULL)
+ {
+ errexit("Error %d opening filelist: %s\n", errno, strerror(errno));
+ }
+ else
+ {
+ /*
+ * GRAB A LINE. FORMAT IS: URL WEIGHTINGFACTOR
+ * EXAMPLE: http://www/file.html 1
+ */
+ D_PRINTF( "File is open.\n" );
+ while(fgets(a_line, BUFSIZ, fp) != NULL)
+ {
+ textvalue = a_line;
+ /* check for comments */
+ if (strchr(textvalue, '#') != NULL)
+ {
+ /* throw out anything after a '#' */
+ D_PRINTF( "Stripping comment from line: %s\n", textvalue );
+ returnval = strcspn(textvalue, "#");
+ D_PRINTF( "Found first # at %d\n", returnval );
+ if (returnval == 0)
+ continue;
+ }
+
+ if (numpages >= *num_of_pages)
+ errexit("Out of space in parse_file_list()\n");
+
+ pp = &page_list[numpages];
+
+ D_PRINTF( "Processing page %ld\n", numpages );
+ loadnum = 0;
+
+ if (textvalue != NULL) { /* is there more? */
+ /* check for weighting factor */
+ D_PRINTF( "Setting page values from: %s\n", textvalue );
+ returnval = sscanf(textvalue, "%s%d", tempbuf, &loadnum);
+ D_PRINTF( "Scan for weighting returns %d, %d\n",
+ returnval, loadnum );
+ if (returnval == EOF || loadnum <= 0)
+ {
+ pp->load_num = 1;
+ }
+ else
+ {
+ pp->load_num = loadnum;
+ }
+ D_PRINTF( "Setting load=%d for line: %s\n",
+ pp->load_num, textvalue );
+
+ /* placeholder for grouping multiple files onto one page */
+ pp->num_of_files = 1;
+ filenum = 0;
+
+ textvalue = tempbuf;
+ D_PRINTF( "Line is now: %s\n", textvalue );
+
+ /*
+ * if we've got a proxy server, we'll assume that the
+ * remaining text is a valid URL, and stuff it into
+ * page_list[numpages].filename[filenum]
+ * Otherwise, we'll have to parse it out.
+ */
+
+ if (haveproxyserver)
+ {
+ pp->servername[filenum] = NULL;
+ pp->port_number[filenum] = 0;
+ strcpy(pp->filename[filenum], textvalue);
+ }
+ else /* no proxy server, so we have to parse it out... */
+ {
+ /* try http://server(:port)/file */
+ D_PRINTF( "Trying http://server(:port)/filename\n" );
+ returnval = sscanf(textvalue, "http://%[^/]%s",
+ tempbuf,
+ a_line);
+ /* check server string for :port */
+ if (returnval != 0 && returnval != EOF)
+ {
+ D_PRINTF( "Setting filename %s\n", a_line );
+ strcpy(pp->filename[filenum],
+ a_line);
+
+ D_PRINTF( "Checking %s for :portnumber\n", tempbuf );
+ returnval = sscanf(tempbuf, "%[^:]:%d",
+ a_line,
+ &pp->port_number[filenum]);
+
+ if (returnval < 2)
+ {
+ pp->port_number[filenum] = 80;
+ }
+ if (returnval == EOF)
+ {
+ pp->servername[filenum] = NULL;
+ }
+ else
+ {
+ D_PRINTF( "Port number %d, setting server %s\n",
+ pp->port_number[filenum],
+ a_line );
+
+ strcpy(pp->servername[filenum], a_line);
+ }
+
+ D_PRINTF( "Server %s, port number %d\n",
+ pp->servername[filenum],
+ pp->port_number[filenum] );
+ }
+ else /* no good - try straight filename */
+ {
+ pp->port_number[filenum] = 80;
+ D_PRINTF( "Trying filename, returnval=%d\n",
+ returnval );
+ pp->servername[filenum] = NULL;
+ D_PRINTF( "Server %s, port number %d\n",
+ pp->servername[filenum],
+ pp->port_number[filenum] );
+ returnval = sscanf(textvalue, "%s", a_line);
+ D_PRINTF( "Scan returned filename %s\n", a_line );
+
+ strcpy(pp->filename[filenum], a_line);
+ } /* end of parsing */
+ } /* end if haveproxyserver */
+
+ D_PRINTF( "Done parsing line\n" );
+ D_PRINTF( "Got server %s, port %d, file %s, returnval %d\n",
+ pp->servername[filenum],
+ pp->port_number[filenum],
+ pp->filename[filenum],
+ returnval );
+ } /* end if textvalue not NULL */
+
+ numpages++;
+ } /* end while not EOF */
+ if (numpages < 1)
+ {
+ returnerr("No files are specified by filelist\n");
+ }
+ } /* end if file ok */
+ fclose(fp);
+ D_PRINTF( "Returning %ld pages and %ld files\n",
+ numpages, numfiles );
+
+ *num_of_pages = numpages;
+ *num_of_files = numfiles;
+}
+/* end parse_file_list */
+
+long int
+load_percent(page_list_t *page_list, long int number_of_pages)
+{
+ int i;
+ long int index_number = 0;
+
+ for (i = 0; i < number_of_pages; i++)
+ {
+ index_number += page_list[i].load_num;
+ }
+
+ D_PRINTF( "load_percent returning %d\n", (index_number) );
+ return(index_number);
+}
+