public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc(refs/users/wschmidt/heads/builtins3)] rs6000: Add helper functions for parsing
@ 2020-08-20 16:37 William Schmidt
0 siblings, 0 replies; 10+ messages in thread
From: William Schmidt @ 2020-08-20 16:37 UTC (permalink / raw)
To: gcc-cvs
https://gcc.gnu.org/g:cb16c9f67e7b25c88a0f30355b463fe1e6ced999
commit cb16c9f67e7b25c88a0f30355b463fe1e6ced999
Author: Bill Schmidt <wschmidt@linux.ibm.com>
Date: Wed Jun 17 09:59:19 2020 -0500
rs6000: Add helper functions for parsing
2020-07-26 Bill Schmidt <wschmidt@linux.ibm.com>
* config/rs6000/rs6000-gen-builtins.c (MININT): New defined
constant.
(exit_codes): New enum.
(consume_whitespace): New function.
(advance_line): Likewise.
(safe_inc_pos): Likewise.
(match_identifier): Likewise.
(match_integer): Likewise.
(match_to_right_bracket): Likewise.
Diff:
---
gcc/config/rs6000/rs6000-gen-builtins.c | 121 ++++++++++++++++++++++++++++++++
1 file changed, 121 insertions(+)
diff --git a/gcc/config/rs6000/rs6000-gen-builtins.c b/gcc/config/rs6000/rs6000-gen-builtins.c
index 8c8fad66edf..e2a9b28eb16 100644
--- a/gcc/config/rs6000/rs6000-gen-builtins.c
+++ b/gcc/config/rs6000/rs6000-gen-builtins.c
@@ -140,6 +140,10 @@ along with GCC; see the file COPYING3. If not see
#include <assert.h>
#include <unistd.h>
+/* Used as a sentinel for range constraints on integer fields. No field can
+ be 32 bits wide, so this is a safe sentinel value. */
+#define MININT INT32_MIN
+
/* Input and output file descriptors and pathnames. */
static FILE *bif_file;
static FILE *ovld_file;
@@ -162,6 +166,11 @@ static char linebuf[LINELEN];
static int line;
static int pos;
+/* Exit codes for the shell. */
+enum exit_codes {
+ EC_INTERR
+};
+
/* Pointer to a diagnostic function. */
void (*diag) (const char *, ...) __attribute__ ((format (printf, 1, 2)))
= NULL;
@@ -187,3 +196,115 @@ ovld_diag (const char * fmt, ...)
va_end (args);
}
+/* Pass over unprintable characters and whitespace (other than a newline,
+ which terminates the scan). */
+static void
+consume_whitespace ()
+{
+ while (pos < LINELEN && isspace(linebuf[pos]) && linebuf[pos] != '\n')
+ pos++;
+ return;
+}
+
+/* Get the next nonblank, noncomment line, returning 0 on EOF, 1 otherwise. */
+static int
+advance_line (FILE *file)
+{
+ while (1)
+ {
+ /* Read ahead one line and check for EOF. */
+ if (!fgets (linebuf, sizeof(linebuf), file))
+ return 0;
+ line++;
+ pos = 0;
+ consume_whitespace ();
+ if (linebuf[pos] != '\n' && linebuf[pos] != ';')
+ return 1;
+ }
+}
+
+static inline void
+safe_inc_pos ()
+{
+ if (pos++ >= LINELEN)
+ {
+ (*diag) ("line length overrun.\n");
+ exit (EC_INTERR);
+ }
+}
+
+/* Match an identifier, returning NULL on failure, else a pointer to a
+ buffer containing the identifier. */
+static char *
+match_identifier ()
+{
+ int lastpos = pos - 1;
+ while (isalnum (linebuf[lastpos + 1]) || linebuf[lastpos + 1] == '_')
+ if (++lastpos >= LINELEN - 1)
+ {
+ (*diag) ("line length overrun.\n");
+ exit (EC_INTERR);
+ }
+
+ if (lastpos < pos)
+ return 0;
+
+ char *buf = (char *) malloc (lastpos - pos + 2);
+ memcpy (buf, &linebuf[pos], lastpos - pos + 1);
+ buf[lastpos - pos + 1] = '\0';
+
+ pos = lastpos + 1;
+ return buf;
+}
+
+/* Match an integer and return its value, or MININT on failure. */
+static int
+match_integer ()
+{
+ int startpos = pos;
+ if (linebuf[pos] == '-')
+ safe_inc_pos ();
+
+ int lastpos = pos - 1;
+ while (isdigit (linebuf[lastpos + 1]))
+ if (++lastpos >= LINELEN - 1)
+ {
+ (*diag) ("line length overrun in match_integer.\n");
+ exit (EC_INTERR);
+ }
+
+ if (lastpos < pos)
+ return MININT;
+
+ pos = lastpos + 1;
+ char *buf = (char *) malloc (lastpos - startpos + 2);
+ memcpy (buf, &linebuf[startpos], lastpos - startpos + 1);
+ buf[lastpos - startpos + 1] = '\0';
+
+ int x;
+ sscanf (buf, "%d", &x);
+ return x;
+}
+
+static const char *
+match_to_right_bracket ()
+{
+ int lastpos = pos - 1;
+ while (linebuf[lastpos + 1] != ']')
+ if (++lastpos >= LINELEN - 1)
+ {
+ (*diag) ("line length overrun.\n");
+ exit (EC_INTERR);
+ }
+
+ if (lastpos < pos)
+ return 0;
+
+ char *buf = (char *) malloc (lastpos - pos + 2);
+ memcpy (buf, &linebuf[pos], lastpos - pos + 1);
+ buf[lastpos - pos + 1] = '\0';
+
+ pos = lastpos + 1;
+ return buf;
+}
+
^ permalink raw reply [flat|nested] 10+ messages in thread
* [gcc(refs/users/wschmidt/heads/builtins3)] rs6000: Add helper functions for parsing
@ 2020-10-29 19:49 William Schmidt
0 siblings, 0 replies; 10+ messages in thread
From: William Schmidt @ 2020-10-29 19:49 UTC (permalink / raw)
To: gcc-cvs
https://gcc.gnu.org/g:578c66b7f1d5b7575c42b7efcb9edb8f6b7bd929
commit 578c66b7f1d5b7575c42b7efcb9edb8f6b7bd929
Author: Bill Schmidt <wschmidt@linux.ibm.com>
Date: Wed Jun 17 09:59:19 2020 -0500
rs6000: Add helper functions for parsing
2020-07-26 Bill Schmidt <wschmidt@linux.ibm.com>
* config/rs6000/rs6000-gen-builtins.c (MININT): New defined
constant.
(exit_codes): New enum.
(consume_whitespace): New function.
(advance_line): Likewise.
(safe_inc_pos): Likewise.
(match_identifier): Likewise.
(match_integer): Likewise.
(match_to_right_bracket): Likewise.
Diff:
---
gcc/config/rs6000/rs6000-gen-builtins.c | 121 ++++++++++++++++++++++++++++++++
1 file changed, 121 insertions(+)
diff --git a/gcc/config/rs6000/rs6000-gen-builtins.c b/gcc/config/rs6000/rs6000-gen-builtins.c
index 8c8fad66edf..e2a9b28eb16 100644
--- a/gcc/config/rs6000/rs6000-gen-builtins.c
+++ b/gcc/config/rs6000/rs6000-gen-builtins.c
@@ -140,6 +140,10 @@ along with GCC; see the file COPYING3. If not see
#include <assert.h>
#include <unistd.h>
+/* Used as a sentinel for range constraints on integer fields. No field can
+ be 32 bits wide, so this is a safe sentinel value. */
+#define MININT INT32_MIN
+
/* Input and output file descriptors and pathnames. */
static FILE *bif_file;
static FILE *ovld_file;
@@ -162,6 +166,11 @@ static char linebuf[LINELEN];
static int line;
static int pos;
+/* Exit codes for the shell. */
+enum exit_codes {
+ EC_INTERR
+};
+
/* Pointer to a diagnostic function. */
void (*diag) (const char *, ...) __attribute__ ((format (printf, 1, 2)))
= NULL;
@@ -187,3 +196,115 @@ ovld_diag (const char * fmt, ...)
va_end (args);
}
+/* Pass over unprintable characters and whitespace (other than a newline,
+ which terminates the scan). */
+static void
+consume_whitespace ()
+{
+ while (pos < LINELEN && isspace(linebuf[pos]) && linebuf[pos] != '\n')
+ pos++;
+ return;
+}
+
+/* Get the next nonblank, noncomment line, returning 0 on EOF, 1 otherwise. */
+static int
+advance_line (FILE *file)
+{
+ while (1)
+ {
+ /* Read ahead one line and check for EOF. */
+ if (!fgets (linebuf, sizeof(linebuf), file))
+ return 0;
+ line++;
+ pos = 0;
+ consume_whitespace ();
+ if (linebuf[pos] != '\n' && linebuf[pos] != ';')
+ return 1;
+ }
+}
+
+static inline void
+safe_inc_pos ()
+{
+ if (pos++ >= LINELEN)
+ {
+ (*diag) ("line length overrun.\n");
+ exit (EC_INTERR);
+ }
+}
+
+/* Match an identifier, returning NULL on failure, else a pointer to a
+ buffer containing the identifier. */
+static char *
+match_identifier ()
+{
+ int lastpos = pos - 1;
+ while (isalnum (linebuf[lastpos + 1]) || linebuf[lastpos + 1] == '_')
+ if (++lastpos >= LINELEN - 1)
+ {
+ (*diag) ("line length overrun.\n");
+ exit (EC_INTERR);
+ }
+
+ if (lastpos < pos)
+ return 0;
+
+ char *buf = (char *) malloc (lastpos - pos + 2);
+ memcpy (buf, &linebuf[pos], lastpos - pos + 1);
+ buf[lastpos - pos + 1] = '\0';
+
+ pos = lastpos + 1;
+ return buf;
+}
+
+/* Match an integer and return its value, or MININT on failure. */
+static int
+match_integer ()
+{
+ int startpos = pos;
+ if (linebuf[pos] == '-')
+ safe_inc_pos ();
+
+ int lastpos = pos - 1;
+ while (isdigit (linebuf[lastpos + 1]))
+ if (++lastpos >= LINELEN - 1)
+ {
+ (*diag) ("line length overrun in match_integer.\n");
+ exit (EC_INTERR);
+ }
+
+ if (lastpos < pos)
+ return MININT;
+
+ pos = lastpos + 1;
+ char *buf = (char *) malloc (lastpos - startpos + 2);
+ memcpy (buf, &linebuf[startpos], lastpos - startpos + 1);
+ buf[lastpos - startpos + 1] = '\0';
+
+ int x;
+ sscanf (buf, "%d", &x);
+ return x;
+}
+
+static const char *
+match_to_right_bracket ()
+{
+ int lastpos = pos - 1;
+ while (linebuf[lastpos + 1] != ']')
+ if (++lastpos >= LINELEN - 1)
+ {
+ (*diag) ("line length overrun.\n");
+ exit (EC_INTERR);
+ }
+
+ if (lastpos < pos)
+ return 0;
+
+ char *buf = (char *) malloc (lastpos - pos + 2);
+ memcpy (buf, &linebuf[pos], lastpos - pos + 1);
+ buf[lastpos - pos + 1] = '\0';
+
+ pos = lastpos + 1;
+ return buf;
+}
+
^ permalink raw reply [flat|nested] 10+ messages in thread
* [gcc(refs/users/wschmidt/heads/builtins3)] rs6000: Add helper functions for parsing
@ 2020-10-27 16:27 William Schmidt
0 siblings, 0 replies; 10+ messages in thread
From: William Schmidt @ 2020-10-27 16:27 UTC (permalink / raw)
To: gcc-cvs
https://gcc.gnu.org/g:c18ffba840fcb08658724a94a515e764e0d29591
commit c18ffba840fcb08658724a94a515e764e0d29591
Author: Bill Schmidt <wschmidt@linux.ibm.com>
Date: Wed Jun 17 09:59:19 2020 -0500
rs6000: Add helper functions for parsing
2020-07-26 Bill Schmidt <wschmidt@linux.ibm.com>
* config/rs6000/rs6000-gen-builtins.c (MININT): New defined
constant.
(exit_codes): New enum.
(consume_whitespace): New function.
(advance_line): Likewise.
(safe_inc_pos): Likewise.
(match_identifier): Likewise.
(match_integer): Likewise.
(match_to_right_bracket): Likewise.
Diff:
---
gcc/config/rs6000/rs6000-gen-builtins.c | 121 ++++++++++++++++++++++++++++++++
1 file changed, 121 insertions(+)
diff --git a/gcc/config/rs6000/rs6000-gen-builtins.c b/gcc/config/rs6000/rs6000-gen-builtins.c
index 8c8fad66edf..e2a9b28eb16 100644
--- a/gcc/config/rs6000/rs6000-gen-builtins.c
+++ b/gcc/config/rs6000/rs6000-gen-builtins.c
@@ -140,6 +140,10 @@ along with GCC; see the file COPYING3. If not see
#include <assert.h>
#include <unistd.h>
+/* Used as a sentinel for range constraints on integer fields. No field can
+ be 32 bits wide, so this is a safe sentinel value. */
+#define MININT INT32_MIN
+
/* Input and output file descriptors and pathnames. */
static FILE *bif_file;
static FILE *ovld_file;
@@ -162,6 +166,11 @@ static char linebuf[LINELEN];
static int line;
static int pos;
+/* Exit codes for the shell. */
+enum exit_codes {
+ EC_INTERR
+};
+
/* Pointer to a diagnostic function. */
void (*diag) (const char *, ...) __attribute__ ((format (printf, 1, 2)))
= NULL;
@@ -187,3 +196,115 @@ ovld_diag (const char * fmt, ...)
va_end (args);
}
+/* Pass over unprintable characters and whitespace (other than a newline,
+ which terminates the scan). */
+static void
+consume_whitespace ()
+{
+ while (pos < LINELEN && isspace(linebuf[pos]) && linebuf[pos] != '\n')
+ pos++;
+ return;
+}
+
+/* Get the next nonblank, noncomment line, returning 0 on EOF, 1 otherwise. */
+static int
+advance_line (FILE *file)
+{
+ while (1)
+ {
+ /* Read ahead one line and check for EOF. */
+ if (!fgets (linebuf, sizeof(linebuf), file))
+ return 0;
+ line++;
+ pos = 0;
+ consume_whitespace ();
+ if (linebuf[pos] != '\n' && linebuf[pos] != ';')
+ return 1;
+ }
+}
+
+static inline void
+safe_inc_pos ()
+{
+ if (pos++ >= LINELEN)
+ {
+ (*diag) ("line length overrun.\n");
+ exit (EC_INTERR);
+ }
+}
+
+/* Match an identifier, returning NULL on failure, else a pointer to a
+ buffer containing the identifier. */
+static char *
+match_identifier ()
+{
+ int lastpos = pos - 1;
+ while (isalnum (linebuf[lastpos + 1]) || linebuf[lastpos + 1] == '_')
+ if (++lastpos >= LINELEN - 1)
+ {
+ (*diag) ("line length overrun.\n");
+ exit (EC_INTERR);
+ }
+
+ if (lastpos < pos)
+ return 0;
+
+ char *buf = (char *) malloc (lastpos - pos + 2);
+ memcpy (buf, &linebuf[pos], lastpos - pos + 1);
+ buf[lastpos - pos + 1] = '\0';
+
+ pos = lastpos + 1;
+ return buf;
+}
+
+/* Match an integer and return its value, or MININT on failure. */
+static int
+match_integer ()
+{
+ int startpos = pos;
+ if (linebuf[pos] == '-')
+ safe_inc_pos ();
+
+ int lastpos = pos - 1;
+ while (isdigit (linebuf[lastpos + 1]))
+ if (++lastpos >= LINELEN - 1)
+ {
+ (*diag) ("line length overrun in match_integer.\n");
+ exit (EC_INTERR);
+ }
+
+ if (lastpos < pos)
+ return MININT;
+
+ pos = lastpos + 1;
+ char *buf = (char *) malloc (lastpos - startpos + 2);
+ memcpy (buf, &linebuf[startpos], lastpos - startpos + 1);
+ buf[lastpos - startpos + 1] = '\0';
+
+ int x;
+ sscanf (buf, "%d", &x);
+ return x;
+}
+
+static const char *
+match_to_right_bracket ()
+{
+ int lastpos = pos - 1;
+ while (linebuf[lastpos + 1] != ']')
+ if (++lastpos >= LINELEN - 1)
+ {
+ (*diag) ("line length overrun.\n");
+ exit (EC_INTERR);
+ }
+
+ if (lastpos < pos)
+ return 0;
+
+ char *buf = (char *) malloc (lastpos - pos + 2);
+ memcpy (buf, &linebuf[pos], lastpos - pos + 1);
+ buf[lastpos - pos + 1] = '\0';
+
+ pos = lastpos + 1;
+ return buf;
+}
+
^ permalink raw reply [flat|nested] 10+ messages in thread
* [gcc(refs/users/wschmidt/heads/builtins3)] rs6000: Add helper functions for parsing
@ 2020-09-16 21:28 William Schmidt
0 siblings, 0 replies; 10+ messages in thread
From: William Schmidt @ 2020-09-16 21:28 UTC (permalink / raw)
To: gcc-cvs
https://gcc.gnu.org/g:204dda15d244a64b9bf2760e53871a81991b2f1c
commit 204dda15d244a64b9bf2760e53871a81991b2f1c
Author: Bill Schmidt <wschmidt@linux.ibm.com>
Date: Wed Jun 17 09:59:19 2020 -0500
rs6000: Add helper functions for parsing
2020-07-26 Bill Schmidt <wschmidt@linux.ibm.com>
* config/rs6000/rs6000-gen-builtins.c (MININT): New defined
constant.
(exit_codes): New enum.
(consume_whitespace): New function.
(advance_line): Likewise.
(safe_inc_pos): Likewise.
(match_identifier): Likewise.
(match_integer): Likewise.
(match_to_right_bracket): Likewise.
Diff:
---
gcc/config/rs6000/rs6000-gen-builtins.c | 121 ++++++++++++++++++++++++++++++++
1 file changed, 121 insertions(+)
diff --git a/gcc/config/rs6000/rs6000-gen-builtins.c b/gcc/config/rs6000/rs6000-gen-builtins.c
index 8c8fad66edf..e2a9b28eb16 100644
--- a/gcc/config/rs6000/rs6000-gen-builtins.c
+++ b/gcc/config/rs6000/rs6000-gen-builtins.c
@@ -140,6 +140,10 @@ along with GCC; see the file COPYING3. If not see
#include <assert.h>
#include <unistd.h>
+/* Used as a sentinel for range constraints on integer fields. No field can
+ be 32 bits wide, so this is a safe sentinel value. */
+#define MININT INT32_MIN
+
/* Input and output file descriptors and pathnames. */
static FILE *bif_file;
static FILE *ovld_file;
@@ -162,6 +166,11 @@ static char linebuf[LINELEN];
static int line;
static int pos;
+/* Exit codes for the shell. */
+enum exit_codes {
+ EC_INTERR
+};
+
/* Pointer to a diagnostic function. */
void (*diag) (const char *, ...) __attribute__ ((format (printf, 1, 2)))
= NULL;
@@ -187,3 +196,115 @@ ovld_diag (const char * fmt, ...)
va_end (args);
}
+/* Pass over unprintable characters and whitespace (other than a newline,
+ which terminates the scan). */
+static void
+consume_whitespace ()
+{
+ while (pos < LINELEN && isspace(linebuf[pos]) && linebuf[pos] != '\n')
+ pos++;
+ return;
+}
+
+/* Get the next nonblank, noncomment line, returning 0 on EOF, 1 otherwise. */
+static int
+advance_line (FILE *file)
+{
+ while (1)
+ {
+ /* Read ahead one line and check for EOF. */
+ if (!fgets (linebuf, sizeof(linebuf), file))
+ return 0;
+ line++;
+ pos = 0;
+ consume_whitespace ();
+ if (linebuf[pos] != '\n' && linebuf[pos] != ';')
+ return 1;
+ }
+}
+
+static inline void
+safe_inc_pos ()
+{
+ if (pos++ >= LINELEN)
+ {
+ (*diag) ("line length overrun.\n");
+ exit (EC_INTERR);
+ }
+}
+
+/* Match an identifier, returning NULL on failure, else a pointer to a
+ buffer containing the identifier. */
+static char *
+match_identifier ()
+{
+ int lastpos = pos - 1;
+ while (isalnum (linebuf[lastpos + 1]) || linebuf[lastpos + 1] == '_')
+ if (++lastpos >= LINELEN - 1)
+ {
+ (*diag) ("line length overrun.\n");
+ exit (EC_INTERR);
+ }
+
+ if (lastpos < pos)
+ return 0;
+
+ char *buf = (char *) malloc (lastpos - pos + 2);
+ memcpy (buf, &linebuf[pos], lastpos - pos + 1);
+ buf[lastpos - pos + 1] = '\0';
+
+ pos = lastpos + 1;
+ return buf;
+}
+
+/* Match an integer and return its value, or MININT on failure. */
+static int
+match_integer ()
+{
+ int startpos = pos;
+ if (linebuf[pos] == '-')
+ safe_inc_pos ();
+
+ int lastpos = pos - 1;
+ while (isdigit (linebuf[lastpos + 1]))
+ if (++lastpos >= LINELEN - 1)
+ {
+ (*diag) ("line length overrun in match_integer.\n");
+ exit (EC_INTERR);
+ }
+
+ if (lastpos < pos)
+ return MININT;
+
+ pos = lastpos + 1;
+ char *buf = (char *) malloc (lastpos - startpos + 2);
+ memcpy (buf, &linebuf[startpos], lastpos - startpos + 1);
+ buf[lastpos - startpos + 1] = '\0';
+
+ int x;
+ sscanf (buf, "%d", &x);
+ return x;
+}
+
+static const char *
+match_to_right_bracket ()
+{
+ int lastpos = pos - 1;
+ while (linebuf[lastpos + 1] != ']')
+ if (++lastpos >= LINELEN - 1)
+ {
+ (*diag) ("line length overrun.\n");
+ exit (EC_INTERR);
+ }
+
+ if (lastpos < pos)
+ return 0;
+
+ char *buf = (char *) malloc (lastpos - pos + 2);
+ memcpy (buf, &linebuf[pos], lastpos - pos + 1);
+ buf[lastpos - pos + 1] = '\0';
+
+ pos = lastpos + 1;
+ return buf;
+}
+
^ permalink raw reply [flat|nested] 10+ messages in thread
* [gcc(refs/users/wschmidt/heads/builtins3)] rs6000: Add helper functions for parsing
@ 2020-09-14 13:57 William Schmidt
0 siblings, 0 replies; 10+ messages in thread
From: William Schmidt @ 2020-09-14 13:57 UTC (permalink / raw)
To: gcc-cvs
https://gcc.gnu.org/g:d5a83de72daea4e9722ee68791602cd93b0c32d5
commit d5a83de72daea4e9722ee68791602cd93b0c32d5
Author: Bill Schmidt <wschmidt@linux.ibm.com>
Date: Wed Jun 17 09:59:19 2020 -0500
rs6000: Add helper functions for parsing
2020-07-26 Bill Schmidt <wschmidt@linux.ibm.com>
* config/rs6000/rs6000-gen-builtins.c (MININT): New defined
constant.
(exit_codes): New enum.
(consume_whitespace): New function.
(advance_line): Likewise.
(safe_inc_pos): Likewise.
(match_identifier): Likewise.
(match_integer): Likewise.
(match_to_right_bracket): Likewise.
Diff:
---
gcc/config/rs6000/rs6000-gen-builtins.c | 121 ++++++++++++++++++++++++++++++++
1 file changed, 121 insertions(+)
diff --git a/gcc/config/rs6000/rs6000-gen-builtins.c b/gcc/config/rs6000/rs6000-gen-builtins.c
index 8c8fad66edf..e2a9b28eb16 100644
--- a/gcc/config/rs6000/rs6000-gen-builtins.c
+++ b/gcc/config/rs6000/rs6000-gen-builtins.c
@@ -140,6 +140,10 @@ along with GCC; see the file COPYING3. If not see
#include <assert.h>
#include <unistd.h>
+/* Used as a sentinel for range constraints on integer fields. No field can
+ be 32 bits wide, so this is a safe sentinel value. */
+#define MININT INT32_MIN
+
/* Input and output file descriptors and pathnames. */
static FILE *bif_file;
static FILE *ovld_file;
@@ -162,6 +166,11 @@ static char linebuf[LINELEN];
static int line;
static int pos;
+/* Exit codes for the shell. */
+enum exit_codes {
+ EC_INTERR
+};
+
/* Pointer to a diagnostic function. */
void (*diag) (const char *, ...) __attribute__ ((format (printf, 1, 2)))
= NULL;
@@ -187,3 +196,115 @@ ovld_diag (const char * fmt, ...)
va_end (args);
}
+/* Pass over unprintable characters and whitespace (other than a newline,
+ which terminates the scan). */
+static void
+consume_whitespace ()
+{
+ while (pos < LINELEN && isspace(linebuf[pos]) && linebuf[pos] != '\n')
+ pos++;
+ return;
+}
+
+/* Get the next nonblank, noncomment line, returning 0 on EOF, 1 otherwise. */
+static int
+advance_line (FILE *file)
+{
+ while (1)
+ {
+ /* Read ahead one line and check for EOF. */
+ if (!fgets (linebuf, sizeof(linebuf), file))
+ return 0;
+ line++;
+ pos = 0;
+ consume_whitespace ();
+ if (linebuf[pos] != '\n' && linebuf[pos] != ';')
+ return 1;
+ }
+}
+
+static inline void
+safe_inc_pos ()
+{
+ if (pos++ >= LINELEN)
+ {
+ (*diag) ("line length overrun.\n");
+ exit (EC_INTERR);
+ }
+}
+
+/* Match an identifier, returning NULL on failure, else a pointer to a
+ buffer containing the identifier. */
+static char *
+match_identifier ()
+{
+ int lastpos = pos - 1;
+ while (isalnum (linebuf[lastpos + 1]) || linebuf[lastpos + 1] == '_')
+ if (++lastpos >= LINELEN - 1)
+ {
+ (*diag) ("line length overrun.\n");
+ exit (EC_INTERR);
+ }
+
+ if (lastpos < pos)
+ return 0;
+
+ char *buf = (char *) malloc (lastpos - pos + 2);
+ memcpy (buf, &linebuf[pos], lastpos - pos + 1);
+ buf[lastpos - pos + 1] = '\0';
+
+ pos = lastpos + 1;
+ return buf;
+}
+
+/* Match an integer and return its value, or MININT on failure. */
+static int
+match_integer ()
+{
+ int startpos = pos;
+ if (linebuf[pos] == '-')
+ safe_inc_pos ();
+
+ int lastpos = pos - 1;
+ while (isdigit (linebuf[lastpos + 1]))
+ if (++lastpos >= LINELEN - 1)
+ {
+ (*diag) ("line length overrun in match_integer.\n");
+ exit (EC_INTERR);
+ }
+
+ if (lastpos < pos)
+ return MININT;
+
+ pos = lastpos + 1;
+ char *buf = (char *) malloc (lastpos - startpos + 2);
+ memcpy (buf, &linebuf[startpos], lastpos - startpos + 1);
+ buf[lastpos - startpos + 1] = '\0';
+
+ int x;
+ sscanf (buf, "%d", &x);
+ return x;
+}
+
+static const char *
+match_to_right_bracket ()
+{
+ int lastpos = pos - 1;
+ while (linebuf[lastpos + 1] != ']')
+ if (++lastpos >= LINELEN - 1)
+ {
+ (*diag) ("line length overrun.\n");
+ exit (EC_INTERR);
+ }
+
+ if (lastpos < pos)
+ return 0;
+
+ char *buf = (char *) malloc (lastpos - pos + 2);
+ memcpy (buf, &linebuf[pos], lastpos - pos + 1);
+ buf[lastpos - pos + 1] = '\0';
+
+ pos = lastpos + 1;
+ return buf;
+}
+
^ permalink raw reply [flat|nested] 10+ messages in thread
* [gcc(refs/users/wschmidt/heads/builtins3)] rs6000: Add helper functions for parsing
@ 2020-08-28 20:06 William Schmidt
0 siblings, 0 replies; 10+ messages in thread
From: William Schmidt @ 2020-08-28 20:06 UTC (permalink / raw)
To: gcc-cvs
https://gcc.gnu.org/g:962e877ab0317ea1dbcfe00a17eee53529acc0f1
commit 962e877ab0317ea1dbcfe00a17eee53529acc0f1
Author: Bill Schmidt <wschmidt@linux.ibm.com>
Date: Wed Jun 17 09:59:19 2020 -0500
rs6000: Add helper functions for parsing
2020-07-26 Bill Schmidt <wschmidt@linux.ibm.com>
* config/rs6000/rs6000-gen-builtins.c (MININT): New defined
constant.
(exit_codes): New enum.
(consume_whitespace): New function.
(advance_line): Likewise.
(safe_inc_pos): Likewise.
(match_identifier): Likewise.
(match_integer): Likewise.
(match_to_right_bracket): Likewise.
Diff:
---
gcc/config/rs6000/rs6000-gen-builtins.c | 121 ++++++++++++++++++++++++++++++++
1 file changed, 121 insertions(+)
diff --git a/gcc/config/rs6000/rs6000-gen-builtins.c b/gcc/config/rs6000/rs6000-gen-builtins.c
index 8c8fad66edf..e2a9b28eb16 100644
--- a/gcc/config/rs6000/rs6000-gen-builtins.c
+++ b/gcc/config/rs6000/rs6000-gen-builtins.c
@@ -140,6 +140,10 @@ along with GCC; see the file COPYING3. If not see
#include <assert.h>
#include <unistd.h>
+/* Used as a sentinel for range constraints on integer fields. No field can
+ be 32 bits wide, so this is a safe sentinel value. */
+#define MININT INT32_MIN
+
/* Input and output file descriptors and pathnames. */
static FILE *bif_file;
static FILE *ovld_file;
@@ -162,6 +166,11 @@ static char linebuf[LINELEN];
static int line;
static int pos;
+/* Exit codes for the shell. */
+enum exit_codes {
+ EC_INTERR
+};
+
/* Pointer to a diagnostic function. */
void (*diag) (const char *, ...) __attribute__ ((format (printf, 1, 2)))
= NULL;
@@ -187,3 +196,115 @@ ovld_diag (const char * fmt, ...)
va_end (args);
}
+/* Pass over unprintable characters and whitespace (other than a newline,
+ which terminates the scan). */
+static void
+consume_whitespace ()
+{
+ while (pos < LINELEN && isspace(linebuf[pos]) && linebuf[pos] != '\n')
+ pos++;
+ return;
+}
+
+/* Get the next nonblank, noncomment line, returning 0 on EOF, 1 otherwise. */
+static int
+advance_line (FILE *file)
+{
+ while (1)
+ {
+ /* Read ahead one line and check for EOF. */
+ if (!fgets (linebuf, sizeof(linebuf), file))
+ return 0;
+ line++;
+ pos = 0;
+ consume_whitespace ();
+ if (linebuf[pos] != '\n' && linebuf[pos] != ';')
+ return 1;
+ }
+}
+
+static inline void
+safe_inc_pos ()
+{
+ if (pos++ >= LINELEN)
+ {
+ (*diag) ("line length overrun.\n");
+ exit (EC_INTERR);
+ }
+}
+
+/* Match an identifier, returning NULL on failure, else a pointer to a
+ buffer containing the identifier. */
+static char *
+match_identifier ()
+{
+ int lastpos = pos - 1;
+ while (isalnum (linebuf[lastpos + 1]) || linebuf[lastpos + 1] == '_')
+ if (++lastpos >= LINELEN - 1)
+ {
+ (*diag) ("line length overrun.\n");
+ exit (EC_INTERR);
+ }
+
+ if (lastpos < pos)
+ return 0;
+
+ char *buf = (char *) malloc (lastpos - pos + 2);
+ memcpy (buf, &linebuf[pos], lastpos - pos + 1);
+ buf[lastpos - pos + 1] = '\0';
+
+ pos = lastpos + 1;
+ return buf;
+}
+
+/* Match an integer and return its value, or MININT on failure. */
+static int
+match_integer ()
+{
+ int startpos = pos;
+ if (linebuf[pos] == '-')
+ safe_inc_pos ();
+
+ int lastpos = pos - 1;
+ while (isdigit (linebuf[lastpos + 1]))
+ if (++lastpos >= LINELEN - 1)
+ {
+ (*diag) ("line length overrun in match_integer.\n");
+ exit (EC_INTERR);
+ }
+
+ if (lastpos < pos)
+ return MININT;
+
+ pos = lastpos + 1;
+ char *buf = (char *) malloc (lastpos - startpos + 2);
+ memcpy (buf, &linebuf[startpos], lastpos - startpos + 1);
+ buf[lastpos - startpos + 1] = '\0';
+
+ int x;
+ sscanf (buf, "%d", &x);
+ return x;
+}
+
+static const char *
+match_to_right_bracket ()
+{
+ int lastpos = pos - 1;
+ while (linebuf[lastpos + 1] != ']')
+ if (++lastpos >= LINELEN - 1)
+ {
+ (*diag) ("line length overrun.\n");
+ exit (EC_INTERR);
+ }
+
+ if (lastpos < pos)
+ return 0;
+
+ char *buf = (char *) malloc (lastpos - pos + 2);
+ memcpy (buf, &linebuf[pos], lastpos - pos + 1);
+ buf[lastpos - pos + 1] = '\0';
+
+ pos = lastpos + 1;
+ return buf;
+}
+
^ permalink raw reply [flat|nested] 10+ messages in thread
* [gcc(refs/users/wschmidt/heads/builtins3)] rs6000: Add helper functions for parsing
@ 2020-08-18 18:43 William Schmidt
0 siblings, 0 replies; 10+ messages in thread
From: William Schmidt @ 2020-08-18 18:43 UTC (permalink / raw)
To: gcc-cvs
https://gcc.gnu.org/g:73f4a6ff1c901455371f99cd7e5d791c9ceaf5bf
commit 73f4a6ff1c901455371f99cd7e5d791c9ceaf5bf
Author: Bill Schmidt <wschmidt@linux.ibm.com>
Date: Wed Jun 17 09:59:19 2020 -0500
rs6000: Add helper functions for parsing
2020-07-26 Bill Schmidt <wschmidt@linux.ibm.com>
* config/rs6000/rs6000-gen-builtins.c (MININT): New defined
constant.
(exit_codes): New enum.
(consume_whitespace): New function.
(advance_line): Likewise.
(safe_inc_pos): Likewise.
(match_identifier): Likewise.
(match_integer): Likewise.
(match_to_right_bracket): Likewise.
Diff:
---
gcc/config/rs6000/rs6000-gen-builtins.c | 121 ++++++++++++++++++++++++++++++++
1 file changed, 121 insertions(+)
diff --git a/gcc/config/rs6000/rs6000-gen-builtins.c b/gcc/config/rs6000/rs6000-gen-builtins.c
index 8c8fad66edf..e2a9b28eb16 100644
--- a/gcc/config/rs6000/rs6000-gen-builtins.c
+++ b/gcc/config/rs6000/rs6000-gen-builtins.c
@@ -140,6 +140,10 @@ along with GCC; see the file COPYING3. If not see
#include <assert.h>
#include <unistd.h>
+/* Used as a sentinel for range constraints on integer fields. No field can
+ be 32 bits wide, so this is a safe sentinel value. */
+#define MININT INT32_MIN
+
/* Input and output file descriptors and pathnames. */
static FILE *bif_file;
static FILE *ovld_file;
@@ -162,6 +166,11 @@ static char linebuf[LINELEN];
static int line;
static int pos;
+/* Exit codes for the shell. */
+enum exit_codes {
+ EC_INTERR
+};
+
/* Pointer to a diagnostic function. */
void (*diag) (const char *, ...) __attribute__ ((format (printf, 1, 2)))
= NULL;
@@ -187,3 +196,115 @@ ovld_diag (const char * fmt, ...)
va_end (args);
}
+/* Pass over unprintable characters and whitespace (other than a newline,
+ which terminates the scan). */
+static void
+consume_whitespace ()
+{
+ while (pos < LINELEN && isspace(linebuf[pos]) && linebuf[pos] != '\n')
+ pos++;
+ return;
+}
+
+/* Get the next nonblank, noncomment line, returning 0 on EOF, 1 otherwise. */
+static int
+advance_line (FILE *file)
+{
+ while (1)
+ {
+ /* Read ahead one line and check for EOF. */
+ if (!fgets (linebuf, sizeof(linebuf), file))
+ return 0;
+ line++;
+ pos = 0;
+ consume_whitespace ();
+ if (linebuf[pos] != '\n' && linebuf[pos] != ';')
+ return 1;
+ }
+}
+
+static inline void
+safe_inc_pos ()
+{
+ if (pos++ >= LINELEN)
+ {
+ (*diag) ("line length overrun.\n");
+ exit (EC_INTERR);
+ }
+}
+
+/* Match an identifier, returning NULL on failure, else a pointer to a
+ buffer containing the identifier. */
+static char *
+match_identifier ()
+{
+ int lastpos = pos - 1;
+ while (isalnum (linebuf[lastpos + 1]) || linebuf[lastpos + 1] == '_')
+ if (++lastpos >= LINELEN - 1)
+ {
+ (*diag) ("line length overrun.\n");
+ exit (EC_INTERR);
+ }
+
+ if (lastpos < pos)
+ return 0;
+
+ char *buf = (char *) malloc (lastpos - pos + 2);
+ memcpy (buf, &linebuf[pos], lastpos - pos + 1);
+ buf[lastpos - pos + 1] = '\0';
+
+ pos = lastpos + 1;
+ return buf;
+}
+
+/* Match an integer and return its value, or MININT on failure. */
+static int
+match_integer ()
+{
+ int startpos = pos;
+ if (linebuf[pos] == '-')
+ safe_inc_pos ();
+
+ int lastpos = pos - 1;
+ while (isdigit (linebuf[lastpos + 1]))
+ if (++lastpos >= LINELEN - 1)
+ {
+ (*diag) ("line length overrun in match_integer.\n");
+ exit (EC_INTERR);
+ }
+
+ if (lastpos < pos)
+ return MININT;
+
+ pos = lastpos + 1;
+ char *buf = (char *) malloc (lastpos - startpos + 2);
+ memcpy (buf, &linebuf[startpos], lastpos - startpos + 1);
+ buf[lastpos - startpos + 1] = '\0';
+
+ int x;
+ sscanf (buf, "%d", &x);
+ return x;
+}
+
+static const char *
+match_to_right_bracket ()
+{
+ int lastpos = pos - 1;
+ while (linebuf[lastpos + 1] != ']')
+ if (++lastpos >= LINELEN - 1)
+ {
+ (*diag) ("line length overrun.\n");
+ exit (EC_INTERR);
+ }
+
+ if (lastpos < pos)
+ return 0;
+
+ char *buf = (char *) malloc (lastpos - pos + 2);
+ memcpy (buf, &linebuf[pos], lastpos - pos + 1);
+ buf[lastpos - pos + 1] = '\0';
+
+ pos = lastpos + 1;
+ return buf;
+}
+
^ permalink raw reply [flat|nested] 10+ messages in thread
* [gcc(refs/users/wschmidt/heads/builtins3)] rs6000: Add helper functions for parsing
@ 2020-07-27 18:46 William Schmidt
0 siblings, 0 replies; 10+ messages in thread
From: William Schmidt @ 2020-07-27 18:46 UTC (permalink / raw)
To: gcc-cvs
https://gcc.gnu.org/g:22c9382b5268214ca3d20eddf2f717f94b62985d
commit 22c9382b5268214ca3d20eddf2f717f94b62985d
Author: Bill Schmidt <wschmidt@linux.ibm.com>
Date: Wed Jun 17 09:59:19 2020 -0500
rs6000: Add helper functions for parsing
2020-07-26 Bill Schmidt <wschmidt@linux.ibm.com>
* config/rs6000/rs6000-gen-builtins.c (MININT): New defined
constant.
(exit_codes): New enum.
(consume_whitespace): New function.
(advance_line): Likewise.
(safe_inc_pos): Likewise.
(match_identifier): Likewise.
(match_integer): Likewise.
(match_to_right_bracket): Likewise.
Diff:
---
gcc/config/rs6000/rs6000-gen-builtins.c | 121 ++++++++++++++++++++++++++++++++
1 file changed, 121 insertions(+)
diff --git a/gcc/config/rs6000/rs6000-gen-builtins.c b/gcc/config/rs6000/rs6000-gen-builtins.c
index 8c8fad66edf..e2a9b28eb16 100644
--- a/gcc/config/rs6000/rs6000-gen-builtins.c
+++ b/gcc/config/rs6000/rs6000-gen-builtins.c
@@ -140,6 +140,10 @@ along with GCC; see the file COPYING3. If not see
#include <assert.h>
#include <unistd.h>
+/* Used as a sentinel for range constraints on integer fields. No field can
+ be 32 bits wide, so this is a safe sentinel value. */
+#define MININT INT32_MIN
+
/* Input and output file descriptors and pathnames. */
static FILE *bif_file;
static FILE *ovld_file;
@@ -162,6 +166,11 @@ static char linebuf[LINELEN];
static int line;
static int pos;
+/* Exit codes for the shell. */
+enum exit_codes {
+ EC_INTERR
+};
+
/* Pointer to a diagnostic function. */
void (*diag) (const char *, ...) __attribute__ ((format (printf, 1, 2)))
= NULL;
@@ -187,3 +196,115 @@ ovld_diag (const char * fmt, ...)
va_end (args);
}
+/* Pass over unprintable characters and whitespace (other than a newline,
+ which terminates the scan). */
+static void
+consume_whitespace ()
+{
+ while (pos < LINELEN && isspace(linebuf[pos]) && linebuf[pos] != '\n')
+ pos++;
+ return;
+}
+
+/* Get the next nonblank, noncomment line, returning 0 on EOF, 1 otherwise. */
+static int
+advance_line (FILE *file)
+{
+ while (1)
+ {
+ /* Read ahead one line and check for EOF. */
+ if (!fgets (linebuf, sizeof(linebuf), file))
+ return 0;
+ line++;
+ pos = 0;
+ consume_whitespace ();
+ if (linebuf[pos] != '\n' && linebuf[pos] != ';')
+ return 1;
+ }
+}
+
+static inline void
+safe_inc_pos ()
+{
+ if (pos++ >= LINELEN)
+ {
+ (*diag) ("line length overrun.\n");
+ exit (EC_INTERR);
+ }
+}
+
+/* Match an identifier, returning NULL on failure, else a pointer to a
+ buffer containing the identifier. */
+static char *
+match_identifier ()
+{
+ int lastpos = pos - 1;
+ while (isalnum (linebuf[lastpos + 1]) || linebuf[lastpos + 1] == '_')
+ if (++lastpos >= LINELEN - 1)
+ {
+ (*diag) ("line length overrun.\n");
+ exit (EC_INTERR);
+ }
+
+ if (lastpos < pos)
+ return 0;
+
+ char *buf = (char *) malloc (lastpos - pos + 2);
+ memcpy (buf, &linebuf[pos], lastpos - pos + 1);
+ buf[lastpos - pos + 1] = '\0';
+
+ pos = lastpos + 1;
+ return buf;
+}
+
+/* Match an integer and return its value, or MININT on failure. */
+static int
+match_integer ()
+{
+ int startpos = pos;
+ if (linebuf[pos] == '-')
+ safe_inc_pos ();
+
+ int lastpos = pos - 1;
+ while (isdigit (linebuf[lastpos + 1]))
+ if (++lastpos >= LINELEN - 1)
+ {
+ (*diag) ("line length overrun in match_integer.\n");
+ exit (EC_INTERR);
+ }
+
+ if (lastpos < pos)
+ return MININT;
+
+ pos = lastpos + 1;
+ char *buf = (char *) malloc (lastpos - startpos + 2);
+ memcpy (buf, &linebuf[startpos], lastpos - startpos + 1);
+ buf[lastpos - startpos + 1] = '\0';
+
+ int x;
+ sscanf (buf, "%d", &x);
+ return x;
+}
+
+static const char *
+match_to_right_bracket ()
+{
+ int lastpos = pos - 1;
+ while (linebuf[lastpos + 1] != ']')
+ if (++lastpos >= LINELEN - 1)
+ {
+ (*diag) ("line length overrun.\n");
+ exit (EC_INTERR);
+ }
+
+ if (lastpos < pos)
+ return 0;
+
+ char *buf = (char *) malloc (lastpos - pos + 2);
+ memcpy (buf, &linebuf[pos], lastpos - pos + 1);
+ buf[lastpos - pos + 1] = '\0';
+
+ pos = lastpos + 1;
+ return buf;
+}
+
^ permalink raw reply [flat|nested] 10+ messages in thread
* [gcc(refs/users/wschmidt/heads/builtins3)] rs6000: Add helper functions for parsing
@ 2020-07-17 17:21 William Schmidt
0 siblings, 0 replies; 10+ messages in thread
From: William Schmidt @ 2020-07-17 17:21 UTC (permalink / raw)
To: gcc-cvs
https://gcc.gnu.org/g:2fa5ff130eecab50e777a190abc89f293b37eb3e
commit 2fa5ff130eecab50e777a190abc89f293b37eb3e
Author: Bill Schmidt <wschmidt@linux.ibm.com>
Date: Wed Jun 17 09:59:19 2020 -0500
rs6000: Add helper functions for parsing
2020-06-17 Bill Schmidt <wschmidt@linux.ibm.com>
* config/rs6000/rs6000-gen-builtins.c (MININT): New defined
constant.
(exit_codes): New enum.
(consume_whitespace): New function.
(advance_line): Likewise.
(safe_inc_pos): Likewise.
(match_identifier): Likewise.
(match_integer): Likewise.
(match_to_right_bracket): Likewise.
Diff:
---
gcc/config/rs6000/rs6000-gen-builtins.c | 121 ++++++++++++++++++++++++++++++++
1 file changed, 121 insertions(+)
diff --git a/gcc/config/rs6000/rs6000-gen-builtins.c b/gcc/config/rs6000/rs6000-gen-builtins.c
index db7afa31f87..6b38a7f6101 100644
--- a/gcc/config/rs6000/rs6000-gen-builtins.c
+++ b/gcc/config/rs6000/rs6000-gen-builtins.c
@@ -141,6 +141,10 @@ along with GCC; see the file COPYING3. If not see
#include <assert.h>
#include <unistd.h>
+/* Used as a sentinel for range constraints on integer fields. No field can
+ be 32 bits wide, so this is a safe sentinel value. */
+#define MININT INT32_MIN
+
/* Input and output file descriptors and pathnames. */
static FILE *bif_file;
static FILE *ovld_file;
@@ -163,6 +167,11 @@ static char linebuf[LINELEN];
static int line;
static int pos;
+/* Exit codes for the shell. */
+enum exit_codes {
+ EC_INTERR
+};
+
/* Pointer to a diagnostic function. */
void (*diag) (const char *, ...) __attribute__ ((format (printf, 1, 2)))
= NULL;
@@ -188,3 +197,115 @@ ovld_diag (const char * fmt, ...)
va_end (args);
}
+/* Pass over unprintable characters and whitespace (other than a newline,
+ which terminates the scan). */
+static void
+consume_whitespace ()
+{
+ while (pos < LINELEN && isspace(linebuf[pos]) && linebuf[pos] != '\n')
+ pos++;
+ return;
+}
+
+/* Get the next nonblank, noncomment line, returning 0 on EOF, 1 otherwise. */
+static int
+advance_line (FILE *file)
+{
+ while (1)
+ {
+ /* Read ahead one line and check for EOF. */
+ if (!fgets (linebuf, sizeof(linebuf), file))
+ return 0;
+ line++;
+ pos = 0;
+ consume_whitespace ();
+ if (linebuf[pos] != '\n' && linebuf[pos] != ';')
+ return 1;
+ }
+}
+
+static inline void
+safe_inc_pos ()
+{
+ if (pos++ >= LINELEN)
+ {
+ (*diag) ("line length overrun.\n");
+ exit (EC_INTERR);
+ }
+}
+
+/* Match an identifier, returning NULL on failure, else a pointer to a
+ buffer containing the identifier. */
+static char *
+match_identifier ()
+{
+ int lastpos = pos - 1;
+ while (isalnum (linebuf[lastpos + 1]) || linebuf[lastpos + 1] == '_')
+ if (++lastpos >= LINELEN - 1)
+ {
+ (*diag) ("line length overrun.\n");
+ exit (EC_INTERR);
+ }
+
+ if (lastpos < pos)
+ return 0;
+
+ char *buf = (char *) malloc (lastpos - pos + 2);
+ memcpy (buf, &linebuf[pos], lastpos - pos + 1);
+ buf[lastpos - pos + 1] = '\0';
+
+ pos = lastpos + 1;
+ return buf;
+}
+
+/* Match an integer and return its value, or MININT on failure. */
+static int
+match_integer ()
+{
+ int startpos = pos;
+ if (linebuf[pos] == '-')
+ safe_inc_pos ();
+
+ int lastpos = pos - 1;
+ while (isdigit (linebuf[lastpos + 1]))
+ if (++lastpos >= LINELEN - 1)
+ {
+ (*diag) ("line length overrun in match_integer.\n");
+ exit (EC_INTERR);
+ }
+
+ if (lastpos < pos)
+ return MININT;
+
+ pos = lastpos + 1;
+ char *buf = (char *) malloc (lastpos - startpos + 2);
+ memcpy (buf, &linebuf[startpos], lastpos - startpos + 1);
+ buf[lastpos - startpos + 1] = '\0';
+
+ int x;
+ sscanf (buf, "%d", &x);
+ return x;
+}
+
+static char *
+match_to_right_bracket ()
+{
+ int lastpos = pos - 1;
+ while (linebuf[lastpos + 1] != ']')
+ if (++lastpos >= LINELEN - 1)
+ {
+ (*diag) ("line length overrun.\n");
+ exit (EC_INTERR);
+ }
+
+ if (lastpos < pos)
+ return 0;
+
+ char *buf = (char *) malloc (lastpos - pos + 2);
+ memcpy (buf, &linebuf[pos], lastpos - pos + 1);
+ buf[lastpos - pos + 1] = '\0';
+
+ pos = lastpos + 1;
+ return buf;
+}
+
^ permalink raw reply [flat|nested] 10+ messages in thread
* [gcc(refs/users/wschmidt/heads/builtins3)] rs6000: Add helper functions for parsing
@ 2020-06-17 20:04 William Schmidt
0 siblings, 0 replies; 10+ messages in thread
From: William Schmidt @ 2020-06-17 20:04 UTC (permalink / raw)
To: gcc-cvs
https://gcc.gnu.org/g:2fd573aba63f034f2d22fea6b3612cef5af70903
commit 2fd573aba63f034f2d22fea6b3612cef5af70903
Author: Bill Schmidt <wschmidt@linux.ibm.com>
Date: Wed Jun 17 09:59:19 2020 -0500
rs6000: Add helper functions for parsing
2020-06-17 Bill Schmidt <wschmidt@linux.ibm.com>
* config/rs6000/rs6000-gen-builtins.c (MININT): New defined
constant.
(exit_codes): New enum.
(consume_whitespace): New function.
(advance_line): Likewise.
(safe_inc_pos): Likewise.
(match_identifier): Likewise.
(match_integer): Likewise.
(match_to_right_bracket): Likewise.
Diff:
---
gcc/config/rs6000/rs6000-gen-builtins.c | 121 ++++++++++++++++++++++++++++++++
1 file changed, 121 insertions(+)
diff --git a/gcc/config/rs6000/rs6000-gen-builtins.c b/gcc/config/rs6000/rs6000-gen-builtins.c
index db7afa31f87..6b38a7f6101 100644
--- a/gcc/config/rs6000/rs6000-gen-builtins.c
+++ b/gcc/config/rs6000/rs6000-gen-builtins.c
@@ -141,6 +141,10 @@ along with GCC; see the file COPYING3. If not see
#include <assert.h>
#include <unistd.h>
+/* Used as a sentinel for range constraints on integer fields. No field can
+ be 32 bits wide, so this is a safe sentinel value. */
+#define MININT INT32_MIN
+
/* Input and output file descriptors and pathnames. */
static FILE *bif_file;
static FILE *ovld_file;
@@ -163,6 +167,11 @@ static char linebuf[LINELEN];
static int line;
static int pos;
+/* Exit codes for the shell. */
+enum exit_codes {
+ EC_INTERR
+};
+
/* Pointer to a diagnostic function. */
void (*diag) (const char *, ...) __attribute__ ((format (printf, 1, 2)))
= NULL;
@@ -188,3 +197,115 @@ ovld_diag (const char * fmt, ...)
va_end (args);
}
+/* Pass over unprintable characters and whitespace (other than a newline,
+ which terminates the scan). */
+static void
+consume_whitespace ()
+{
+ while (pos < LINELEN && isspace(linebuf[pos]) && linebuf[pos] != '\n')
+ pos++;
+ return;
+}
+
+/* Get the next nonblank, noncomment line, returning 0 on EOF, 1 otherwise. */
+static int
+advance_line (FILE *file)
+{
+ while (1)
+ {
+ /* Read ahead one line and check for EOF. */
+ if (!fgets (linebuf, sizeof(linebuf), file))
+ return 0;
+ line++;
+ pos = 0;
+ consume_whitespace ();
+ if (linebuf[pos] != '\n' && linebuf[pos] != ';')
+ return 1;
+ }
+}
+
+static inline void
+safe_inc_pos ()
+{
+ if (pos++ >= LINELEN)
+ {
+ (*diag) ("line length overrun.\n");
+ exit (EC_INTERR);
+ }
+}
+
+/* Match an identifier, returning NULL on failure, else a pointer to a
+ buffer containing the identifier. */
+static char *
+match_identifier ()
+{
+ int lastpos = pos - 1;
+ while (isalnum (linebuf[lastpos + 1]) || linebuf[lastpos + 1] == '_')
+ if (++lastpos >= LINELEN - 1)
+ {
+ (*diag) ("line length overrun.\n");
+ exit (EC_INTERR);
+ }
+
+ if (lastpos < pos)
+ return 0;
+
+ char *buf = (char *) malloc (lastpos - pos + 2);
+ memcpy (buf, &linebuf[pos], lastpos - pos + 1);
+ buf[lastpos - pos + 1] = '\0';
+
+ pos = lastpos + 1;
+ return buf;
+}
+
+/* Match an integer and return its value, or MININT on failure. */
+static int
+match_integer ()
+{
+ int startpos = pos;
+ if (linebuf[pos] == '-')
+ safe_inc_pos ();
+
+ int lastpos = pos - 1;
+ while (isdigit (linebuf[lastpos + 1]))
+ if (++lastpos >= LINELEN - 1)
+ {
+ (*diag) ("line length overrun in match_integer.\n");
+ exit (EC_INTERR);
+ }
+
+ if (lastpos < pos)
+ return MININT;
+
+ pos = lastpos + 1;
+ char *buf = (char *) malloc (lastpos - startpos + 2);
+ memcpy (buf, &linebuf[startpos], lastpos - startpos + 1);
+ buf[lastpos - startpos + 1] = '\0';
+
+ int x;
+ sscanf (buf, "%d", &x);
+ return x;
+}
+
+static char *
+match_to_right_bracket ()
+{
+ int lastpos = pos - 1;
+ while (linebuf[lastpos + 1] != ']')
+ if (++lastpos >= LINELEN - 1)
+ {
+ (*diag) ("line length overrun.\n");
+ exit (EC_INTERR);
+ }
+
+ if (lastpos < pos)
+ return 0;
+
+ char *buf = (char *) malloc (lastpos - pos + 2);
+ memcpy (buf, &linebuf[pos], lastpos - pos + 1);
+ buf[lastpos - pos + 1] = '\0';
+
+ pos = lastpos + 1;
+ return buf;
+}
+
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2020-10-29 19:49 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-08-20 16:37 [gcc(refs/users/wschmidt/heads/builtins3)] rs6000: Add helper functions for parsing William Schmidt
-- strict thread matches above, loose matches on Subject: below --
2020-10-29 19:49 William Schmidt
2020-10-27 16:27 William Schmidt
2020-09-16 21:28 William Schmidt
2020-09-14 13:57 William Schmidt
2020-08-28 20:06 William Schmidt
2020-08-18 18:43 William Schmidt
2020-07-27 18:46 William Schmidt
2020-07-17 17:21 William Schmidt
2020-06-17 20:04 William Schmidt
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).