[BACK]Return to calcread.c CVS log [TXT][DIR] Up to [local] / OpenXM_contrib / gmp / demos / calc

Annotation of OpenXM_contrib/gmp/demos/calc/calcread.c, Revision 1.1.1.1

1.1       ohara       1: /* Readline support for calc program.
                      2:
                      3: Copyright 2000, 2001 Free Software Foundation, Inc.
                      4:
                      5: This file is part of the GNU MP Library.
                      6:
                      7: This program is free software; you can redistribute it and/or modify it under
                      8: the terms of the GNU General Public License as published by the Free Software
                      9: Foundation; either version 2 of the License, or (at your option) any later
                     10: version.
                     11:
                     12: This program is distributed in the hope that it will be useful, but WITHOUT ANY
                     13: WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
                     14: PARTICULAR PURPOSE.  See the GNU General Public License for more details.
                     15:
                     16: You should have received a copy of the GNU General Public License along with
                     17: this program; if not, write to the Free Software Foundation, Inc., 59 Temple
                     18: Place - Suite 330, Boston, MA 02111-1307, USA. */
                     19:
                     20: #include "calc-common.h"
                     21:
                     22: #if WITH_READLINE
                     23: #include <stdio.h>   /* for FILE for old versions of readline/readline.h */
                     24: #include <stdlib.h>  /* for free */
                     25: #include <string.h>  /* for strdup */
                     26: #include <unistd.h>  /* for isatty */
                     27: #include <readline/readline.h>
                     28: #include <readline/history.h>
                     29:
                     30: #include "gmp.h"
                     31:
                     32:
                     33: /* change this to "#define TRACE(x) x" for a few diagnostics */
                     34: #define TRACE(x)
                     35:
                     36:
                     37: #define MIN(x,y) ((x) < (y) ? (x) : (y))
                     38:
                     39: char *
                     40: calc_completion_entry (const char *text, int state)
                     41: {
                     42:   static int  index, len;
                     43:   char  *name;
                     44:
                     45:   if (!state)
                     46:     {
                     47:       index = 0;
                     48:       len = strlen (text);
                     49:     }
                     50:   TRACE (printf ("calc_completion_entry %s %d, index=%d len=%d\n",
                     51:                  text, state, index, len));
                     52:   while ((name = calc_keywords[index].name) != NULL)
                     53:     {
                     54:       index++;
                     55:       if (memcmp (name, text, len) == 0)
                     56:         return (strdup (name));
                     57:     }
                     58:   return NULL;
                     59: }
                     60:
                     61: void
                     62: calc_init_readline (void)
                     63: {
                     64:   /* By default use readline when the input is a tty.  It's a bit contrary
                     65:      to the GNU interface conventions to make the behaviour depend on where
                     66:      the input is coming from, but this is pretty convenient.  */
                     67:   if (calc_option_readline == -1)
                     68:     {
                     69:       calc_option_readline = isatty (fileno (stdin));
                     70:       TRACE (printf ("calc_option_readline %d\n", calc_option_readline));
                     71:     }
                     72:
                     73:   if (calc_option_readline)
                     74:     {
                     75:       printf ("GNU MP demo calculator program, gmp version %s\n", gmp_version);
                     76:       printf ("Type \"help\" for help.\n");
                     77:       rl_readline_name = "gmp-calc";
                     78:       rl_completion_entry_function = calc_completion_entry;
                     79:     }
                     80: }
                     81:
                     82:
                     83: /* This function is supposed to return YY_NULL to indicate EOF, but that
                     84:    constant is only in calclex.c and we don't want to clutter calclex.l with
                     85:    this readline stuff, so instead just hard code 0 for YY_NULL.  That's
                     86:    it's defined value on unix anyway.  */
                     87:
                     88: int
                     89: calc_input (char *buf, size_t max_size)
                     90: {
                     91:   if (calc_option_readline)
                     92:     {
                     93:       static char    *line = NULL;
                     94:       static size_t  line_size = 0;
                     95:       static size_t  upto = 0;
                     96:       size_t         copy_size;
                     97:
                     98:       if (upto >= line_size)
                     99:         {
                    100:           if (line != NULL)
                    101:             free (line);
                    102:
                    103:           line = readline (calc_more_input ? "more> " : "> ");
                    104:           calc_more_input = 1;
                    105:           if (line == NULL)
                    106:             return 0;
                    107:           TRACE (printf ("readline: %s\n", line));
                    108:
                    109:           if (line[0] != '\0')
                    110:             add_history (line);
                    111:
                    112:           line_size = strlen (line);
                    113:           line[line_size] = '\n';
                    114:           line_size++;
                    115:           upto = 0;
                    116:         }
                    117:
                    118:       copy_size = MIN (line_size-upto, max_size);
                    119:       memcpy (buf, line+upto, copy_size);
                    120:       upto += copy_size;
                    121:       return copy_size;
                    122:     }
                    123:   else
                    124:     {
                    125:       /* not readline */
                    126:       return fread (buf, 1, max_size, stdin);
                    127:     }
                    128: }
                    129:
                    130:
                    131: /* This redefined input() might let a traditional lex use the readline
                    132:    support here.  Apparently POSIX doesn't specify whether an override like
                    133:    this will work, so maybe it'll work or maybe it won't.  This function is
                    134:    also not particularly efficient, but don't worry about that, since flex
                    135:    is the preferred parser.  */
                    136:
                    137: int
                    138: input (void)
                    139: {
                    140:   char  c;
                    141:   if (calc_input (&c, 1) != 1)
                    142:     return EOF;
                    143:   else
                    144:     return (int) c;
                    145: }
                    146:
                    147: #endif /* WITH_READLINE */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>