/****************************************************************************** * Copyright (c) 2004, 2008 IBM Corporation * All rights reserved. * This program and the accompanying materials * are made available under the terms of the BSD License * which accompanies this distribution, and is available at * http://www.opensource.org/licenses/bsd-license.php * * Contributors: * IBM Corporation - initial implementation *****************************************************************************/ #include #include extern int main (int, char**); extern int callback (int, char **); int _start(char *arg_string, long len); unsigned long callback_entry(void *base, unsigned long len); #define MAX_ARGV 10 static int gen_argv(const char *arg_string, int len, char* argv[]) { const char *str, *str_end, *arg_string_end = arg_string + len; int i; str = arg_string; for (i = 0; i < MAX_ARGV; i++) { str_end = str; while((*str_end++ != ' ') && (str_end <= arg_string_end)); argv[i] = malloc(str_end-str); memcpy (argv[i], str, str_end-str-1); argv[i][str_end-str-1] = '\0'; str = str_end-1; while(*(++str) == ' '); if (str >= arg_string_end) break; } return i+1; } int _start(char * arg_string, long len) { int rc; int argc; char* argv[MAX_ARGV]; argc = gen_argv(arg_string, len, argv); rc = main(argc, argv); return rc; } /* * Takes a Forth representation of a string and generates an argument array, * then calls callback(). */ unsigned long callback_entry(void *base, unsigned long len) { char *argv[MAX_ARGV]; int argc; argc = gen_argv(base, len, argv); return (callback(argc, argv)); }