home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / emacs-19.28-src.tgz / tar.out / fsf / emacs / lib-src / profile.c < prev    next >
C/C++ Source or Header  |  1996-09-28  |  2KB  |  92 lines

  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 Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  21.  
  22.  
  23. /**
  24.  **  To be run as an emacs process. Input string that starts with:
  25.  **    'z' -- resets the watch (to zero).
  26.  **    'p' -- return time (on stdout) as string with format <sec>.<micro-sec>
  27.  **    'q' -- exit.
  28.  **
  29.  **  abstraction : a stopwatch
  30.  **  operations: reset_watch, get_time
  31.  */
  32. #include <stdio.h>
  33. #include <../src/config.h>
  34. #include <../src/systime.h>
  35.  
  36. static struct timeval TV1, TV2;
  37. static int watch_not_started = 1; /* flag */
  38. static char time_string[30];
  39.  
  40. /* Reset the stopwatch to zero.  */
  41.  
  42. int
  43. reset_watch ()
  44. {
  45.   EMACS_GET_TIME (TV1);
  46.   watch_not_started = 0;
  47. }
  48.  
  49. /* This call returns the time since the last reset_watch call.  The time
  50.    is returned as a string with the format  <seconds>.<micro-seconds> 
  51.    If reset_watch was not called yet, exit.  */
  52.  
  53. char *
  54. get_time ()
  55. {
  56.   if (watch_not_started)
  57.     exit (1);  /* call reset_watch first ! */
  58.   EMACS_GET_TIME (TV2);
  59.   if (TV1.tv_usec > TV2.tv_usec)
  60.     {
  61.       TV2.tv_usec += 1000000;
  62.       TV2.tv_sec--;
  63.     }
  64.   sprintf (time_string, "%lu.%06lu",
  65.       TV2.tv_sec - TV1.tv_sec, TV2.tv_usec - TV1.tv_usec);
  66.   return time_string;
  67. }
  68.  
  69. void
  70. main ()
  71. {
  72.   int c;
  73.   while ((c = getchar ()) != EOF)
  74.     {
  75.       switch (c)
  76.     {
  77.     case 'z':
  78.       reset_watch ();
  79.       break;
  80.     case 'p':
  81.       puts (get_time ());
  82.       break;
  83.     case 'q':
  84.       exit (0);
  85.     }
  86.       /* Anything remaining on the line is ignored.  */
  87.       while (c != '\n' && c != EOF)
  88.     c = getchar ();
  89.     }
  90.   exit (1);
  91. }
  92.