text: /******************************************************************************
   * 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 <stdlib.h>
  #include <string.h>
  extern int main (int, char**);
  extern int callback (int, char **);
  
  #define MAX_ARGV 10
  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));
  }
  
  