Changeset 227 for trunk/src/gmake/kmkbuiltin.c
- Timestamp:
- Feb 9, 2005, 11:21:34 AM (20 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/gmake/kmkbuiltin.c
r225 r227 26 26 27 27 #include <string.h> 28 #include <stdlib.h> 28 29 #include <stdio.h> 30 #include <ctype.h> 29 31 #include "kmkbuiltin.h" 30 32 31 int kmk_builtin_cp(char **argv) 33 extern char **environ; 34 35 extern int kmk_builtin_cp(int argc, char **argv, char **envp); 36 extern int kmk_builtin_chmod(int argc, char **argv, char **envp); 37 extern int kmk_builtin_echo(int argc, char **argv, char **envp); 38 extern int kmk_builtin_mkdir(int argc, char **argv, char **envp); 39 extern int kmk_builtin_mv(int argc, char **argv, char **envp); 40 extern int kmk_builtin_rm(int argc, char **argv, char **envp); 41 extern int kmk_builtin_rmdir(int argc, char **argv, char **envp); 42 43 int kmk_builtin_command(const char *pszCmd) 32 44 { 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; 34 165 } 35 166 36 int kmk_builtin_command(char **argv) 167 168 int kmk_builtin_command_parsed(int argc, char **argv) 37 169 { 38 170 const char *pszCmd = argv[0]; … … 52 184 * String switch on the command. 53 185 */ 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); 56 189 //else if (!strcmp(pszCmd, "chmod")) 57 190 // 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); 60 195 //else if (!strcmp(pszCmd, "mv")) 61 196 // rc = kmk_builtin_mv(argv);
Note:
See TracChangeset
for help on using the changeset viewer.