/****************************************************************************
- * Copyright 2020,2021 Thomas E. Dickey *
+,* Copyright 2020-2022,2023 Thomas E. Dickey *
* Copyright 1998-2016,2017 Free Software Foundation, Inc. *
* *
* Permission is hereby granted, free of charge, to any person obtaining a *
#include <ctype.h>
#include <tic.h>
-MODULE_ID("$Id: comp_scan.c,v 1.112 2021/10/04 23:56:28 tom Exp $")
+MODULE_ID("$Id: comp_scan.c,v 1.122 2023/05/27 20:13:10 tom Exp $")
/*
* Maximum length of string capability we'll accept before raising an error.
NCURSES_EXPORT(void)
_nc_reset_input(FILE *fp, char *buf)
{
+ TR(TRACE_DATABASE,
+ (T_CALLED("_nc_reset_input(fp=%p, buf=%p)"), (void *) fp, buf));
+
pushtype = NO_PUSHBACK;
if (pushname != 0)
pushname[0] = '\0';
if (fp != 0)
_nc_curr_line = 0;
_nc_curr_col = 0;
+
+ returnVoidDB;
}
/*
return result;
}
+/*
+ * Read, like fgets(), but error-out if the input contains nulls.
+ */
+static int
+get_text(char *buffer, int length)
+{
+ int count = 0;
+ int limit = length - 1;
+
+ while (limit-- > 0) {
+ int ch = fgetc(yyin);
+
+ if (ch == '\0') {
+ _nc_err_abort("This is not a text-file");
+ } else if (ch == EOF) {
+ break;
+ }
+ ++count;
+ *buffer++ = (char) ch;
+ if (ch == '\n')
+ break;
+ }
+ *buffer = '\0';
+ return count;
+}
+
/*
* int next_char()
*
if (used == 0)
_nc_curr_file_pos = ftell(yyin);
- if (fgets(result + used, (int) (allocated - used), yyin) != 0) {
+ if (get_text(result + used, (int) (allocated - used))) {
bufstart = result;
if (used == 0) {
if (_nc_curr_line == 0
/* push a character back onto the input stream */
{
if (bufptr == bufstart)
- _nc_syserr_abort("Can't backspace off beginning of line");
+ _nc_syserr_abort("cannot backspace off beginning of line");
*--bufptr = (char) c;
_nc_curr_col--;
}
stream_pos(void)
/* return our current character position in the input stream */
{
- return (yyin ? ftell(yyin) : (bufptr ? bufptr - bufstart : 0));
+ return (yyin ? ftell(yyin) : (bufptr ? (long) (bufptr - bufstart) : 0));
}
static bool
end_of_stream(void)
/* are we at end of input? */
{
- return ((yyin ? feof(yyin) : (bufptr && *bufptr == '\0'))
+ return ((yyin
+ ? (feof(yyin) && (bufptr == NULL || *bufptr == '\0'))
+ : (bufptr && *bufptr == '\0'))
? TRUE : FALSE);
}
static NCURSES_INLINE int
eat_escaped_newline(int ch)
{
- if (ch == '\\')
- while ((ch = next_char()) == '\n' || iswhite(ch))
- continue;
+ if (ch == '\\') {
+ while ((ch = next_char()) == '\n' || iswhite(ch)) {
+ /* EMPTY */ ;
+ }
+ }
return ch;
}
int old_col;
#endif
+ DEBUG(3, (T_CALLED("_nc_get_token(silent=%d)"), silent));
+
if (pushtype != NO_PUSHBACK) {
int retval = pushtype;
pushname[0] = '\0';
/* currtok wasn't altered by _nc_push_token() */
+ DEBUG(3, (T_RETURN("%d"), retval));
return (retval);
}
if (_nc_curr_token.tk_name == tok_buf)
_nc_curr_token.tk_name = 0;
}
+ DEBUG(3, (T_RETURN("%d"), EOF));
return (EOF);
}
while ((ch = next_char()) == '\n' || iswhite(ch)) {
if (ch == '\n')
had_newline = TRUE;
- continue;
}
ch = eat_escaped_newline(ch);
dot_flag = TRUE;
DEBUG(8, ("dot-flag set"));
- while ((ch = next_char()) == '.' || iswhite(ch))
- continue;
+ while ((ch = next_char()) == '.' || iswhite(ch)) {
+ /* EMPTY */ ;
+ }
}
if (ch == EOF) {
/* throw away trailing /, *$/ */
for (--tok_ptr;
iswhite(*tok_ptr) || *tok_ptr == ',';
- tok_ptr--)
- continue;
+ tok_ptr--) {
+ /* EMPTY */ ;
+ }
tok_ptr[1] = '\0';
}
}
} else {
after_list = tok_buf + strlen(tok_buf);
- DEBUG(1, ("missing description"));
+ DEBUG(2, ("missing description"));
}
/*
: "<null>"),
type));
+ DEBUG(3, (T_RETURN("%d"), type));
return (type);
}
*/
NCURSES_EXPORT(int)
-_nc_trans_string(char *ptr, char *last)
+_nc_trans_string(char *ptr, const char *const last)
{
int count = 0;
int number = 0;