update.
[chise/xemacs-chise.git-] / lib-src / profile.c
1 /* profile.c --- generate periodic events for profiling of Emacs Lisp code.
2  Copyright (C) 1992, 1994 Free Software Foundation, Inc.
3
4  Author: Boaz Ben-Zvi <boaz@lcs.mit.edu>
5
6  This file is part of GNU Emacs.
7
8  GNU Emacs is free software; you can redistribute it and/or modify
9  it under the terms of the GNU General Public License as published by
10  the Free Software Foundation; either version 2, or (at your option)
11  any later version.
12
13  GNU Emacs is distributed in the hope that it will be useful,
14  but WITHOUT ANY WARRANTY; without even the implied warranty of
15  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  GNU General Public License for more details.
17
18  You should have received a copy of the GNU General Public License
19  along with GNU Emacs; see the file COPYING.  If not, write to
20  the Free the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
21 Boston, MA 02111-1307, USA.  */
22
23 /* Synched up with: FSF 19.28. */
24 /* #### Not sure if this is needed for XEmacs. */
25
26 /**
27  **  To be run as an emacs process. Input string that starts with:
28  **    'z' -- resets the watch (to zero).
29  **    'p' -- return time (on stdout) as string with format <sec>.<micro-sec>
30  **    'q' -- exit.
31  **
32  **  abstraction : a stopwatch
33  **  operations: reset_watch, get_time
34  */
35 #include <config.h>
36 #include <stdio.h>
37 #include <stdlib.h>
38 #include "../src/systime.h"
39
40 static struct timeval TV1, TV2;
41 static int watch_not_started = 1; /* flag */
42 static char time_string[30];
43
44 #ifdef WIN32_NATIVE
45 #include <sys/timeb.h>
46 /* Emulate gettimeofday (Ulrich Leodolter, 1/11/95).  */
47 void 
48 gettimeofday (struct timeval *tv, struct timezone *tz)
49 {
50   struct _timeb tb;
51   _ftime (&tb);
52
53   tv->tv_sec = tb.time;
54   tv->tv_usec = tb.millitm * 1000L;
55   if (tz) 
56     {
57       tz->tz_minuteswest = tb.timezone; /* minutes west of Greenwich  */
58       tz->tz_dsttime = tb.dstflag;      /* type of dst correction  */
59     }
60 }
61 #endif
62
63 /* Reset the stopwatch to zero.  */
64
65 static void
66 reset_watch (void)
67 {
68   EMACS_GET_TIME (TV1);
69   watch_not_started = 0;
70 }
71
72 /* This call returns the time since the last reset_watch call.  The time
73    is returned as a string with the format  <seconds>.<micro-seconds> 
74    If reset_watch was not called yet, exit.  */
75
76 static char *
77 get_time (void)
78 {
79   if (watch_not_started)
80     exit (1);  /* call reset_watch first ! */
81   EMACS_GET_TIME (TV2);
82   if (TV1.tv_usec > TV2.tv_usec)
83     {
84       TV2.tv_usec += 1000000;
85       TV2.tv_sec--;
86     }
87   sprintf (time_string, "%lu.%06lu",
88           (unsigned long) TV2.tv_sec - TV1.tv_sec,
89           (unsigned long) TV2.tv_usec - TV1.tv_usec);
90   return time_string;
91 }
92
93 int
94 main (int argc, char *argv[])
95 {
96   int c;
97   while ((c = getchar ()) != EOF)
98     {
99       switch (c)
100         {
101         case 'z':
102           reset_watch ();
103           break;
104         case 'p':
105           puts (get_time ());
106           break;
107         case 'q':
108           exit (0);
109         }
110       /* Anything remaining on the line is ignored.  */
111       while (c != '\n' && c != EOF)
112         c = getchar ();
113     }
114   return 1;
115 }