Ignore:
Timestamp:
Feb 9, 2005, 11:21:34 AM (20 years ago)
Author:
bird
Message:

builtin stuff.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/gmake/kmkbuiltin.c

    r225 r227  
    2626
    2727#include <string.h>
     28#include <stdlib.h>
    2829#include <stdio.h>
     30#include <ctype.h>
    2931#include "kmkbuiltin.h"
    3032
    31 int kmk_builtin_cp(char **argv)
     33extern char **environ;
     34
     35extern int kmk_builtin_cp(int argc, char **argv, char **envp);
     36extern int kmk_builtin_chmod(int argc, char **argv, char **envp);
     37extern int kmk_builtin_echo(int argc, char **argv, char **envp);
     38extern int kmk_builtin_mkdir(int argc, char **argv, char **envp);
     39extern int kmk_builtin_mv(int argc, char **argv, char **envp);
     40extern int kmk_builtin_rm(int argc, char **argv, char **envp);
     41extern int kmk_builtin_rmdir(int argc, char **argv, char **envp);
     42
     43int kmk_builtin_command(const char *pszCmd)
    3244{
    33     return 1;
     45    int         argc;
     46    char      **argv;
     47    char       *psz;
     48    int         rc;
     49
     50    /*
     51     * Check and skip the prefix.
     52     */
     53    if (strncmp(pszCmd, "kmk_builtin_", sizeof("kmk_builtin_") - 1))
     54    {
     55        printf("kmk_builtin: Invalid command prefix '%s'!\n", pszCmd);
     56        return 1;
     57    }
     58
     59    /*
     60     * Parse arguments.
     61     */
     62    argc = 0;
     63    argv = NULL;
     64    while (*pszCmd)
     65    {
     66        const char *pszEnd;
     67        const char *pszNext;
     68        int         fEscaped = 0;
     69        size_t      cch;
     70
     71        /*
     72         * Find start and end of the current command.
     73         */
     74        if (*pszCmd == '"' || *pszCmd == '\'')
     75        {
     76            pszEnd = pszCmd;
     77            for (;;)
     78            {
     79                pszEnd = strchr(pszEnd + 1, *pszCmd);
     80                if (!pszEnd)
     81                {
     82                    printf("kmk_builtin: Unbalanced quote in argument %d: %s\n", argc + 1, pszCmd);
     83                    while (argc--)
     84                        free(argv[argc]);
     85                    free(argv);
     86                    return 1;
     87                }
     88                /* two quotes -> escaped quote. */
     89                if (pszEnd[0] != pszEnd[1])
     90                    break;
     91                fEscaped = 1;
     92            }
     93            pszNext = pszEnd + 1;
     94            pszCmd++;
     95        }
     96        else
     97        {
     98            pszEnd = pszCmd + 1;
     99            while (!isspace(*pszEnd))
     100                pszEnd++;
     101            pszNext = pszEnd;
     102        }
     103
     104        /*
     105         * Make argument.
     106         */
     107        if (!(argc % 16))
     108        {
     109            void *pv = realloc(argv, sizeof(char *) * (argc + 17));
     110            if (!pv)
     111            {
     112                printf("kmk_builtin: out of memory. argc=%d\n", argc);
     113                break;
     114            }
     115            argv = (char **)pv;
     116        }
     117        cch = pszEnd - pszCmd;
     118        argv[argc] = malloc(cch + 1);
     119        if (!argv[argc])
     120        {
     121            printf("kmk_builtin: out of memory. argc=%d len=%d\n", argc, pszEnd - pszCmd + 1);
     122            break;
     123        }
     124        memcpy(argv[argc], pszCmd, cch);
     125        argv[argc][cch] = '\0';
     126
     127        /* unescape quotes? */
     128        if (fEscaped)
     129        {
     130            char ch = pszCmd[-1];
     131            char *pszW = argv[argc];
     132            char *pszR = argv[argc];
     133            while (*pszR)
     134            {
     135                if (*pszR == ch)
     136                    pszR++;
     137                *pszW++ = *pszR++;
     138            }
     139            *pszW = '\0';
     140        }
     141        /* commit it */
     142        argv[++argc] = NULL;
     143
     144        /*
     145         * Next
     146         */
     147        pszCmd = pszNext;
     148        if (isspace(*pszCmd))
     149            pszCmd++;
     150    }
     151
     152    /*
     153     * Execute the command if parsing was successful.
     154     */
     155    if (!*pszCmd)
     156        rc = kmk_builtin_command_parsed(argc, argv);
     157    else
     158        rc = 1;
     159
     160    /* clean up and return. */
     161    while (argc--)
     162        free(argv[argc]);
     163    free(argv);
     164    return rc;
    34165}
    35166
    36 int kmk_builtin_command(char **argv)
     167
     168int kmk_builtin_command_parsed(int argc, char **argv)
    37169{
    38170    const char *pszCmd = argv[0];
     
    52184     * String switch on the command.
    53185     */
    54     if (!strcmp(pszCmd, "cp"))
    55         rc = kmk_builtin_cp(argv);
     186    if (0) { }
     187    //if (!strcmp(pszCmd, "cp"))
     188    //    rc = kmk_builtin_cp(argc, argv, environ);
    56189    //else if (!strcmp(pszCmd, "chmod"))
    57190    //    rc = kmk_builtin_chmod(argv);
    58     //else if (!strcmp(pszCmd, "mkdir"))
    59     //    rc = kmk_builtin_mkdir(argv);
     191    else if (!strcmp(pszCmd, "echo"))
     192        rc = kmk_builtin_echo(argc, argv, environ);
     193    else if (!strcmp(pszCmd, "mkdir"))
     194        rc = kmk_builtin_mkdir(argc, argv, environ);
    60195    //else if (!strcmp(pszCmd, "mv"))
    61196    //    rc = kmk_builtin_mv(argv);
Note: See TracChangeset for help on using the changeset viewer.