idmap_engine.c revision 61b364a9162c5e321625fcd2f640da7e1dd2417e
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/*
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * CDDL HEADER START
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * The contents of this file are subject to the terms of the
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Common Development and Distribution License (the "License").
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * You may not use this file except in compliance with the License.
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * or http://www.opensolaris.org/os/licensing.
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * See the License for the specific language governing permissions
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * and limitations under the License.
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * When distributing Covered Code, include this CDDL HEADER in each
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * If applicable, add the following below this CDDL HEADER, with the
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * fields enclosed by brackets "[]" replaced with your own identifying
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * information: Portions Copyright [yyyy] [name of copyright owner]
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * CDDL HEADER END
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/*
4edd44c51fec55142bfb7fb1ee7aaa13a910a80fjp * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Use is subject to license terms.
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#pragma ident "%Z%%M% %I% %E% SMI"
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#include <stdio.h>
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#include <stdlib.h>
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#include <strings.h>
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#include <locale.h>
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#include <ctype.h>
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#ifdef WITH_LIBTECLA
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#include <libtecla.h>
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#endif
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#include "idmap_engine.h"
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/* The maximal line length. Longer lines may not be parsed OK. */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#define MAX_CMD_LINE_SZ 1023
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#ifdef WITH_LIBTECLA
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#define MAX_HISTORY_LINES 1023
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwstatic GetLine * gl_h;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/* LINTED E_STATIC_UNUSED */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#endif
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/* Array for arguments of the actuall command */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwstatic char ** my_argv;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/* Allocated size for my_argv */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwstatic int my_argv_size = 16;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/* Actuall length of my_argv */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwstatic int my_argc;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/* Array for subcommands */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwstatic cmd_ops_t *my_comv;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/* my_comc length */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwstatic int my_comc;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/* Input filename specified by the -f flag */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwstatic char *my_filename;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/*
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Batch mode means reading file, stdin or libtecla input. Shell input is
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * a non-batch mode.
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwstatic int my_batch_mode;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/* Array of all possible flags */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwstatic flag_t flags[FLAG_ALPHABET_SIZE];
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/* getopt variables */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwextern char *optarg;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwextern int optind, optopt, opterr;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/* Fill the flags array: */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwstatic int
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwoptions_parse(int argc, char *argv[], const char *options)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw{
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw char c;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw optind = 1;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw while ((c = getopt(argc, argv, options)) != EOF) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw switch (c) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw case '?':
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (-1);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw case ':':
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* This is relevant only if options starts with ':': */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (void) fprintf(stderr,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw gettext("Option %s: missing parameter\n"),
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw argv[optind - 1]);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (-1);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw default:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (optarg == NULL)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw flags[c] = FLAG_SET;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw else
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw flags[c] = optarg;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (optind);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/* Unset all flags */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwstatic void
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwoptions_clean()
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw{
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (void) memset(flags, 0, FLAG_ALPHABET_SIZE * sizeof (flag_t));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/* determine which subcommand is argv[0] and execute its handler */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwstatic int
4edd44c51fec55142bfb7fb1ee7aaa13a910a80fjprun_command(int argc, char **argv, cmd_pos_t *pos)
4edd44c51fec55142bfb7fb1ee7aaa13a910a80fjp{
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw int i;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (argc == 0) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (my_batch_mode)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (0);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (-1);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw for (i = 0; i < my_comc; i++) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw int optind;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw int rc;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (strcmp(my_comv[i].cmd, argv[0]) != 0)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw continue;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* We found it. Now execute the handler. */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw options_clean();
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw optind = options_parse(argc, argv, my_comv[i].options);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (optind < 0) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (-1);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
8e22821528b08c6dba4e8176351560f316f6d0dedm rc = my_comv[i].p_do_func(flags,
8e22821528b08c6dba4e8176351560f316f6d0dedm argc - optind,
8e22821528b08c6dba4e8176351560f316f6d0dedm argv + optind,
8e22821528b08c6dba4e8176351560f316f6d0dedm pos);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (rc);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (void) fprintf(stderr, gettext("Unknown command %s\n"),
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw argv[0]);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (-1);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/*
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Read another parameter from "from", up to a space char (unless it
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * is quoted). Duplicate it to "to". Remove quotation, if any.
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwstatic int
4edd44c51fec55142bfb7fb1ee7aaa13a910a80fjpget_param(char **to, const char *from)
4edd44c51fec55142bfb7fb1ee7aaa13a910a80fjp{
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw int to_i, from_i;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw char c;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw int last_slash = 0; /* Preceded by a slash? */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw int in_string = 0; /* Inside quites? */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw int is_param = 0;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw size_t buf_size = 20; /* initial length of the buffer. */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw char *buf = (char *)malloc(buf_size * sizeof (char));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw from_i = 0;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw while (isspace(from[from_i]))
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw from_i++;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw for (to_i = 0; '\0' != from[from_i]; from_i++) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw c = from[from_i];
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (to_i >= buf_size - 1) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw buf_size *= 2;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw buf = (char *)realloc(buf, buf_size * sizeof (char));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (c == '"' && !last_slash) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw in_string = !in_string;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw is_param = 1;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw continue;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw } else if (c == '\\' && !last_slash) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw last_slash = 1;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw continue;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw } else if (!last_slash && !in_string && isspace(c)) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw break;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw buf[to_i++] = from[from_i];
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw last_slash = 0;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (to_i == 0 && !is_param) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw free(buf);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *to = NULL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (0);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw buf[to_i] = '\0';
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *to = buf;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (in_string)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (-1);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (from_i);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/*
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Split a string to a parameter array and append it to the specified position
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * of the array
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwstatic int
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwline2array(const char *line)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw{
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw const char *cur;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw char *param;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw int len;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw for (cur = line; len = get_param(&param, cur); cur += len) {
61b364a9162c5e321625fcd2f640da7e1dd2417ejp if (my_argc >= my_argv_size) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw my_argv_size *= 2;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw my_argv = (char **)realloc(my_argv,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw my_argv_size * sizeof (char *));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw my_argv[my_argc] = param;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw ++my_argc;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* quotation not closed */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (len < 0)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (-1);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (0);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/* Clean all aruments from my_argv. Don't deallocate my_argv itself. */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwstatic void
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwmy_argv_clean()
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw{
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw int i;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw for (i = 0; i < my_argc; i++) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw free(my_argv[i]);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw my_argv[i] = NULL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw my_argc = 0;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#ifdef WITH_LIBTECLA
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/* This is libtecla tab completion. */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwstatic
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwCPL_MATCH_FN(command_complete)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw{
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /*
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * WordCompletion *cpl; const char *line; int word_end are
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * passed from the CPL_MATCH_FN macro.
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw int i;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw char *prefix;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw int prefix_l;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* We go on even if quotation is not closed */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (void) line2array(line);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* Beginning of the line: */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (my_argc == 0) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw for (i = 0; i < my_comc; i++)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (void) cpl_add_completion(cpl, line, word_end,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw word_end, my_comv[i].cmd, "", " ");
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw goto cleanup;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* Is there something to complete? */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (isspace(line[word_end - 1]))
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw goto cleanup;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw prefix = my_argv[my_argc - 1];
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw prefix_l = strlen(prefix);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* Subcommand name: */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (my_argc == 1) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw for (i = 0; i < my_comc; i++)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (strncmp(prefix, my_comv[i].cmd, prefix_l) == 0)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (void) cpl_add_completion(cpl, line,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw word_end - prefix_l,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw word_end, my_comv[i].cmd + prefix_l,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw "", " ");
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw goto cleanup;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* Long options: */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (prefix[0] == '-' && prefix [1] == '-') {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw char *options2 = NULL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw char *paren;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw char *thesis;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw int i;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw for (i = 0; i < my_comc; i++)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (0 == strcmp(my_comv[i].cmd, my_argv[0])) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw options2 = strdup(my_comv[i].options);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw break;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* No such subcommand, or not enough memory: */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (options2 == NULL)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw goto cleanup;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw for (paren = strchr(options2, '(');
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw paren && ((thesis = strchr(paren + 1, ')')) != NULL);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw paren = strchr(thesis + 1, '(')) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* Short option or thesis must precede, so this is safe: */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *(paren - 1) = '-';
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *paren = '-';
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *thesis = '\0';
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (strncmp(paren - 1, prefix, prefix_l) == 0) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (void) cpl_add_completion(cpl, line,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw word_end - prefix_l,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw word_end, paren - 1 + prefix_l, "", " ");
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw free(options2);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* "--" is a valid completion */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (prefix_l == 2) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (void) cpl_add_completion(cpl, line,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw word_end - 2,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw word_end, "", "", " ");
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwcleanup:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw my_argv_clean();
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (0);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/* libtecla subshell: */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwstatic int
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwinteractive_interp()
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw{
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw int rc = 0;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw char *prompt;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw const char *line;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (void) sigset(SIGINT, SIG_IGN);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw gl_h = new_GetLine(MAX_CMD_LINE_SZ, MAX_HISTORY_LINES);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (gl_h == NULL) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (void) fprintf(stderr,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw gettext("Error reading terminal: %s.\n"),
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw gl_error_message(gl_h, NULL, 0));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (-1);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (void) gl_customize_completion(gl_h, NULL, command_complete);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw for (;;) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwnew_line:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw my_argv_clean();
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw prompt = "> ";
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwcontinue_line:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw line = gl_get_line(gl_h, prompt, NULL, -1);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (line == NULL) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw switch (gl_return_status(gl_h)) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw case GLR_SIGNAL:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw gl_abandon_line(gl_h);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw goto new_line;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw case GLR_EOF:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (void) line2array("exit");
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw break;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw case GLR_ERROR:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (void) fprintf(stderr,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw gettext("Error reading terminal: %s.\n"),
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw gl_error_message(gl_h, NULL, 0));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw rc = -1;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw goto end_of_input;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw default:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (void) fprintf(stderr, "Internal error.\n");
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw exit(1);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw } else {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (line2array(line) < 0) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (void) fprintf(stderr,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw gettext("Quotation not closed\n"));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw goto new_line;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (my_argc == 0) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw goto new_line;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (strcmp(my_argv[my_argc-1], "\n") == 0) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw my_argc--;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw free(my_argv[my_argc]);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (void) strcpy(prompt, "> ");
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw goto continue_line;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
8e22821528b08c6dba4e8176351560f316f6d0dedm rc = run_command(my_argc, my_argv, NULL);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (strcmp(my_argv[0], "exit") == 0 && rc == 0) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw break;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwend_of_input:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw gl_h = del_GetLine(gl_h);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw my_argv_clean();
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (rc);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#endif
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/* Interpretation of a source file given by "name" */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwstatic int
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwsource_interp(const char *name)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw{
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw FILE *f;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw int is_stdin;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw int rc = -1;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw char line[MAX_CMD_LINE_SZ];
8e22821528b08c6dba4e8176351560f316f6d0dedm cmd_pos_t pos;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (name == NULL || strcmp("-", name) == 0) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw f = stdin;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw is_stdin = 1;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw } else {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw is_stdin = 0;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw f = fopen(name, "r");
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (f == NULL) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw perror(name);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (-1);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
8e22821528b08c6dba4e8176351560f316f6d0dedm pos.linenum = 0;
8e22821528b08c6dba4e8176351560f316f6d0dedm pos.line = line;
8e22821528b08c6dba4e8176351560f316f6d0dedm
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw while (fgets(line, MAX_CMD_LINE_SZ, f)) {
8e22821528b08c6dba4e8176351560f316f6d0dedm pos.linenum ++;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (line2array(line) < 0) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (void) fprintf(stderr,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw gettext("Quotation not closed\n"));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw my_argv_clean();
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw continue;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw /* We do not wan't "\n" as the last parameter */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (my_argc != 0 && strcmp(my_argv[my_argc-1], "\n") == 0) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw my_argc--;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw free(my_argv[my_argc]);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw continue;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (my_argc != 0 && strcmp(my_argv[0], "exit") == 0) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw rc = 0;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw my_argv_clean();
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw break;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
8e22821528b08c6dba4e8176351560f316f6d0dedm rc = run_command(my_argc, my_argv, &pos);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw my_argv_clean();
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (my_argc > 0) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (void) fprintf(stderr, gettext("Line continuation missing\n"));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw rc = 1;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw my_argv_clean();
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (!is_stdin)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (void) fclose(f);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (rc);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/*
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Initialize the engine.
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * comc, comv is the array of subcommands and its length,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * argc, argv are arguments to main to be scanned for -f filename and
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * the length og the array,
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * is_batch_mode passes to the caller the information if the
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * batch mode is on.
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Return values:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * 0: ... OK
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * IDMAP_ENG_ERROR: error and message printed already
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * IDMAP_ENG_ERROR_SILENT: error and message needs to be printed
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwint
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwengine_init(int comc, cmd_ops_t *comv, int argc, char **argv,
4edd44c51fec55142bfb7fb1ee7aaa13a910a80fjp int *is_batch_mode)
4edd44c51fec55142bfb7fb1ee7aaa13a910a80fjp{
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw int c;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw my_comc = comc;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw my_comv = comv;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw my_argc = 0;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw my_argv = (char **)calloc(my_argv_size, sizeof (char *));
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (argc < 1) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw my_filename = NULL;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (isatty(fileno(stdin))) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#ifdef WITH_LIBTECLA
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw my_batch_mode = 1;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#else
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw my_batch_mode = 0;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_ENG_ERROR_SILENT);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#endif
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw } else
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw my_batch_mode = 1;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw goto the_end;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw my_batch_mode = 0;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw optind = 0;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw while ((c = getopt(argc, argv,
4edd44c51fec55142bfb7fb1ee7aaa13a910a80fjp "f:(command-file)")) != EOF) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw switch (c) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw case '?':
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (IDMAP_ENG_ERROR);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw case 'f':
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw my_batch_mode = 1;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw my_filename = optarg;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw break;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw default:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw (void) fprintf(stderr, "Internal error.\n");
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw exit(1);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwthe_end:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (is_batch_mode != NULL)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw *is_batch_mode = my_batch_mode;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (0);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/* finitialize the engine */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwint
4edd44c51fec55142bfb7fb1ee7aaa13a910a80fjpengine_fini()
4edd44c51fec55142bfb7fb1ee7aaa13a910a80fjp{
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw my_argv_clean();
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw free(my_argv);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (0);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw/*
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * Interpret the subcommands defined by the arguments, unless
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw * my_batch_mode was set on in egnine_init.
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw */
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwint
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwrun_engine(int argc, char **argv)
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw{
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw int rc = -1;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (my_batch_mode) {
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#ifdef WITH_LIBTECLA
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw if (isatty(fileno(stdin)))
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw rc = interactive_interp();
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw else
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw#endif
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw rc = source_interp(my_filename);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw goto cleanup;
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw }
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
8e22821528b08c6dba4e8176351560f316f6d0dedm rc = run_command(argc, argv, NULL);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw
c5c4113dfcabb1eed3d4bdf7609de5170027a794nwcleanup:
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw return (rc);
c5c4113dfcabb1eed3d4bdf7609de5170027a794nw}