spinner.c
上传用户:qaz666999
上传日期:2022-08-06
资源大小:2570k
文件大小:3k
- /* A stupid little spinning wheel designed to make it look like useful work
- is being done.
- Copyright 1999, 2000, 2001 Free Software Foundation, Inc.
- This file is part of the GNU MP Library.
- The GNU MP Library is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation; either version 3 of the License, or (at your
- option) any later version.
- The GNU MP Library is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
- License for more details.
- You should have received a copy of the GNU Lesser General Public License
- along with the GNU MP Library. If not, see http://www.gnu.org/licenses/. */
- #include "config.h"
- #include <signal.h>
- #include <stdio.h>
- #include <stdlib.h>
- #if HAVE_UNISTD_H
- #include <unistd.h> /* for isatty */
- #endif
- #include "gmp.h"
- #include "gmp-impl.h"
- #include "tests.h"
- /* "alarm" is not available on mingw32, and the SIGALRM constant is not
- defined. Don't bother with a spinner in this case. */
- #if ! HAVE_ALARM || ! defined (SIGALRM)
- #define alarm(n) abort()
- #define signal(sig,func) SIG_ERR
- #endif
- /* An application can update this to get a count printed with the spinner.
- If left at 0, no count is printed. */
- unsigned long spinner_count = 0;
- int spinner_wanted = -1; /* -1 uninitialized, 1 wanted, 0 not */
- int spinner_tick = 1; /* 1 ready to print, 0 not */
- /*ARGSUSED*/
- RETSIGTYPE
- spinner_signal (int signum)
- {
- spinner_tick = 1;
- if (signal (SIGALRM, spinner_signal) == SIG_ERR)
- {
- printf ("spinner_signal(): Oops, cannot reinstall SIGALRMn");
- abort ();
- }
- alarm (1);
- }
- /* Initialize the spinner.
- This is done the first time spinner() is called, so an application
- doesn't need to call this directly.
- The spinner is only wanted if the output is a tty. */
- #define SPINNER_WANTED_INIT()
- if (spinner_wanted < 0) spinner_init ()
- void
- spinner_init (void)
- {
- spinner_wanted = isatty (fileno (stdout));
- if (spinner_wanted == -1)
- abort ();
- if (!spinner_wanted)
- return;
- if (signal (SIGALRM, spinner_signal) == SIG_ERR)
- {
- printf ("(no spinner)r");
- spinner_tick = 0;
- return;
- }
- alarm (1);
- /* unbufferred output so the spinner will show up */
- setbuf (stdout, NULL);
- }
- void
- spinner (void)
- {
- static const char data[] = { '|', '/', '-', '\' };
- static int pos = 0;
- char buf[128];
- SPINNER_WANTED_INIT ();
- if (spinner_tick)
- {
- buf[0] = data[pos];
- pos = (pos + 1) % numberof (data);
- spinner_tick = 0;
- if (spinner_count != 0)
- {
- sprintf (buf+1, " %lur", spinner_count);
- }
- else
- {
- buf[1] = 'r';
- buf[2] = ' ';
- }
- fputs (buf, stdout);
- }
- }