src/lib/apacheLog.c 1.2

1.2 2009/08/27 03:54:39 kent
Checking for zero chromosome coordinate (supposed to be 1-based coordinates)
Index: src/lib/apacheLog.c
===================================================================
RCS file: /projects/compbio/cvsroot/kent/src/lib/apacheLog.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -b -B -U 1000000 -r1.1 -r1.2
--- src/lib/apacheLog.c	3 Sep 2005 02:07:40 -0000	1.1
+++ src/lib/apacheLog.c	27 Aug 2009 03:54:39 -0000	1.2
@@ -1,157 +1,172 @@
 /* apacheLog - stuff to parse out apache web server logs, currently
  * just the access log. */
 
 #include "common.h"
 #include "obscure.h"
 #include "apacheLog.h"
 
 static char const rcsid[] = "$Id$";
 
 void apacheAccessLogFree(struct apacheAccessLog **pLl)
 /* Free up apacheAccessLog. */
 {
 struct apacheAccessLog *ll = *pLl;
 if (ll != NULL)
     {
     freeMem(ll->buf);
     freez(pLl);
     }
 }
 
 
 static void badFormat(struct apacheAccessLog **pLl, char *line, char *fileName, 
 	int lineIx, char *message)
 /* Complain about format if verbose flag is on.  Free up
  * *pLl */
 {
 if (verboseLevel()  > 1)
     {
     if (fileName != NULL)
 	warn("%s line %d: %s", fileName, lineIx, message);
     else
 	warn("%s", message);
     }
 }
 
 static void unterminatedQuote(struct apacheAccessLog **pLl, char *line, 
 	char *fileName, int lineIx)
 /* Complain about unterminated quote. */
 {
 badFormat(pLl, line, fileName, lineIx, 
 	"missing closing quote");
 }
 
 static void shortLine(struct apacheAccessLog **pLl, char *line, 
 	char *fileName, int lineIx)
 /* Complain about short line. */
 {
 badFormat(pLl, line, fileName, lineIx, 
 	"short line");
 }
 
 static void badTimeStamp(struct apacheAccessLog **pLl, char *line, 
 	char *fileName, int lineIx)
 /* Complain about bad time stamp. */
 {
 badFormat(pLl, line, fileName, lineIx, 
 	"bad time stamp");
 }
 
 struct apacheAccessLog *apacheAccessLogParse(char *line, 
 	char *fileName, int lineIx)
 /* Return a apacheAccessLog from line.  Return NULL if there's a parsing 
  * problem, but don't abort. */
 {
 struct apacheAccessLog *ll;
 char *buf, *s, *e;
 AllocVar(ll);
 ll->buf = buf = cloneString(line);
 ll->ip = nextWord(&buf);
 ll->dash1 = nextWord(&buf);
 ll->dash2 = nextWord(&buf);
 if (buf == NULL)
     {
     shortLine(&ll, line, fileName, lineIx);
     return NULL;
     }
 s = strchr(buf, '[');
 if (s == NULL)
     {
     badTimeStamp(&ll, line, fileName, lineIx);
     return NULL;
     }
 s += 1;
 e = strchr(s, ']');
 if (e == NULL)
     {
     badTimeStamp(&ll, line, fileName, lineIx);
     return NULL;
     }
 *e = 0;
 ll->timeStamp = nextWord(&s);
 if (!isdigit(ll->timeStamp[0]))
     {
     badTimeStamp(&ll, line, fileName, lineIx);
     return NULL;
     }
 ll->timeZone = nextWord(&s);
 buf = e+2;
 if (buf[0] != '"')
     {
     badFormat(&ll, line, fileName, lineIx, "Missing quote after time stamp");
     return NULL;
     }
 if (!parseQuotedString(buf, buf, &e))
     {
     unterminatedQuote(&ll, line, fileName, lineIx);
     return NULL;
     }
 ll->method = nextWord(&buf);
 ll->url = nextWord(&buf);
 ll->httpVersion = nextWord(&buf);
 if (ll->url == NULL)
     {
     badFormat(&ll, line, fileName, lineIx, "Missing URL");
     return NULL;
     }
 buf = e;
 s = nextWord(&buf);
 if (!isdigit(s[0]))
     {
     badFormat(&ll, line, fileName, lineIx, "Non-numerical status code");
     return NULL;
     }
 ll->status = atoi(s);
 ll->num1 = nextWord(&buf);
 if (buf == NULL)
     {
     shortLine(&ll, line, fileName, lineIx);
     return NULL;
     }
 if (buf[0] != '"')
     {
     badFormat(&ll, line, fileName, lineIx, "Missing quote after request");
     return NULL;
     }
 if (!parseQuotedString(buf, buf, &e))
     {
     unterminatedQuote(&ll, line, fileName, lineIx);
     return NULL;
     }
 if (!sameString(buf, "-"))
     ll->referrer = buf;
 buf = e + 1;
 if (buf[0] != '"')
     {
     badFormat(&ll, line, fileName, lineIx, "Missing quote after referrer");
     return NULL;
     }
 if (!parseQuotedString(buf, buf, &e))
     {
     unterminatedQuote(&ll, line, fileName, lineIx);
     return NULL;
     }
 ll->program = buf;
+
+/* Parse out elapsed time if it's there. */
+ll->runTime = -1;		/* Marker for unset. */
+char *runTime = nextWord(&e);
+char *seconds = nextWord(&e);
+if (seconds != NULL && sameString(seconds, "seconds"))
+    {
+    if (!isdigit(runTime[0]))
+        {
+	badFormat(&ll, line, fileName, lineIx, "non-numerical seconds");
+	return NULL;
+	}
+    ll->runTime = atoi(runTime);
+    }
+
 return ll;
 }