+ 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. */