1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
|
/************************************************************************
* utils.c -- various utilities for rpncalc *
* *
* Refer to rpncalc.c for copyrights and license permissions. *
************************************************************************/
/* $Id: utils.c,v 1.6 1999/03/06 14:35:17 david Rel david $
* $Log: utils.c,v $
* Revision 1.6 1999/03/06 14:35:17 david
* Internationalized.
* Removed lint comments.
*
* Revision 1.5 1998/01/03 22:57:39 david
* replaced HAVE_READLINE with HAVE_LIBREADLINE (for autoconf)
*
* Revision 1.4 1997/01/19 18:58:58 david
* Changed dupstr(char *) to dupstr(const char *)
*
* Revision 1.4 1997/01/19 18:19:23 david
* Changed dupstr(char *) to dupstr(const char *)
*
* Revision 1.2 1996/09/13 20:21:29 david
* lclint additions
*
* Revision 1.1 1996/07/13 20:58:36 david
* Added dupstr()
* Moved getline() from rpncalc.c into utils.c
*
* Revision 1.0 1995/12/31 18:19:34 david
* Initial revision
*
* Revision 1.0 1995/11/25 20:02:25 david
* Initial revision
* */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "utils.h"
#include "config.h"
#ifdef HAVE_LIBREADLINE
#include <readline/readline.h>
#include <readline/history.h>
#endif
#ifdef HAVE_GETTEXT
#include <libintl.h>
#define _(String) gettext(String)
#else
#define _(String) (String)
#define textdomain(Domain)
#define bindtextdomain(Package, Directory)
#endif
#define LINEFRAGMENT 32
void *xmalloc(size_t size) /* safe malloc */
{
void *ptr;
ptr=malloc(size);
if (ptr == NULL) {
perror(_("Out of memory!"));
exit(1);
}
return ptr;
}
void *xrealloc(void *ptr, size_t size) /* save realloc */
{
ptr=realloc(ptr, size);
if (ptr == NULL) {
perror(_("Out of memory!"));
exit(1);
}
return ptr;
}
char *xstrdup(const char *s)
{
char *r;
r = (char *)xmalloc (strlen (s) + 1);
strcpy (r, s);
return (r);
}
#ifndef HAVE_READLINE
char *readline(char *prompt)
/* Read a line of text without imposing an length limit.
If we readline support is compiled in, use the readline function. */
{
char *line=NULL;
int c, i;
i=0; line=(char *)xmalloc((size_t)(LINEFRAGMENT+1));
while (((c = getc(stdin)) != EOF) && (c != '\n') && (c != '\0')) {
if ((i > LINEFRAGMENT) && (i % LINEFRAGMENT) == 0) {
line=(char *)xrealloc(line,(size_t)(LINEFRAGMENT+1));
}
line[i]=(char)c; i++;
}
if ((c != EOF) && (c != '\0')) {
line[i]='\0';
} else {
free(line);
line=NULL; /* this is readline compatible;
return NULL when the input line is empty */
}
return line;
}
#endif
|