+/* Computes extensions from the grammar file extension. */
+static void
+compute_exts_from_gf (const char *ext)
+{
+ src_extension = tr (ext, 'y', 'c');
+ src_extension = tr (src_extension, 'Y', 'C');
+ header_extension = tr (ext, 'y', 'h');
+ header_extension = tr (header_extension, 'Y', 'H');
+}
+
+/* Computes extensions from the given c source file extension. */
+static void
+compute_exts_from_src (const char *ext)
+{
+ /* We use this function when the user specifies `-o' or `--output',
+ so the extenions must be computed unconditionally from the file name
+ given by this option. */
+ src_extension = xstrdup (ext);
+ header_extension = tr (ext, 'c', 'h');
+ header_extension = tr (header_extension, 'C', 'H');
+}
+
+
+/* Decompose FILENAME in four parts: *BASE, *TAB, and *EXT, the fourth
+ part, (the directory) is ranging from FILENAME to the char before
+ *BASE, so we don't need an additional parameter.
+
+ *EXT points to the last period in the basename, or NULL if none.
+
+ If there is no *EXT, *TAB is NULL. Otherwise, *TAB points to
+ `.tab' or `_tab' if present right before *EXT, or is NULL. *TAB
+ cannot be equal to *BASE.
+
+ None are allocated, they are simply pointers to parts of FILENAME.
+ Examples:
+
+ '/tmp/foo.tab.c' -> *BASE = 'foo.tab.c', *TAB = '.tab.c', *EXT =
+ '.c'
+
+ 'foo.c' -> *BASE = 'foo.c', *TAB = NULL, *EXT = '.c'
+
+ 'tab.c' -> *BASE = 'tab.c', *TAB = NULL, *EXT = '.c'
+
+ '.tab.c' -> *BASE = '.tab.c', *TAB = NULL, *EXT = '.c'
+
+ 'foo.tab' -> *BASE = 'foo.tab', *TAB = NULL, *EXT = '.tab'
+
+ 'foo_tab' -> *BASE = 'foo_tab', *TAB = NULL, *EXT = NULL
+
+ 'foo' -> *BASE = 'foo', *TAB = NULL, *EXT = NULL. */
+
+static void
+filename_split (const char *filename,
+ const char **base, const char **tab, const char **ext)
+{
+ *base = base_name (filename);
+
+ /* Look for the extension, i.e., look for the last dot. */
+ *ext = strrchr (*base, '.');
+ *tab = NULL;
+
+ /* If there is an exentension, check if there is a `.tab' part right
+ before. */
+ if (*ext
+ && (*ext - *base) > (int) strlen (".tab")
+ && (!strncmp (*ext - strlen (".tab"), ".tab", strlen (".tab"))
+ || !strncmp (*ext - strlen ("_tab"), "_tab", strlen ("_tab"))))
+ *tab = *ext - strlen (".tab");
+}
+
+
+/* FIXME: Should use xstrndup. */
+
+static void
+compute_base_names (void)
+{
+ const char *base, *tab, *ext;
+
+ /* If --output=foo.c was specified (SPEC_OUTFILE == foo.c),
+ BASE_NAME and SHORT_BASE_NAME are `foo'.
+
+ If --output=foo.tab.c was specified, BASE_NAME is `foo.tab' and
+ SHORT_BASE_NAME is `foo'.
+
+ The precise -o name will be used for FTABLE. For other output
+ files, remove the ".c" or ".tab.c" suffix. */