text: /*
   * This file is derived from the MicroPython project, http://micropython.org/
   *
   * Copyright (c) 2018, Pycom Limited and its licensors.
   *
   * This software is licensed under the GNU GPL version 3 or any later version,
   * with permitted additional terms. For more information see the Pycom Licence
   * v1.0 document supplied with this file, or available at:
   * https://www.pycom.io/opensource/licensing
   */
  
  /*
   * This file is part of the MicroPython project, http://micropython.org/
   *
   * The MIT License (MIT)
   *
   * Copyright (c) 2016 Damien P. George on behalf of Pycom Ltd
   *
   * Permission is hereby granted, free of charge, to any person obtaining a copy
   * of this software and associated documentation files (the "Software"), to deal
   * in the Software without restriction, including without limitation the rights
   * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
   * copies of the Software, and to permit persons to whom the Software is
   * furnished to do so, subject to the following conditions:
   *
   * The above copyright notice and this permission notice shall be included in
   * all copies or substantial portions of the Software.
   *
   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
   * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
   * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
   * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
   * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
   * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
   * THE SOFTWARE.
   */
  
  #include <stdio.h>
  
  #include "py/mpconfig.h"
  #include "py/obj.h"
  
  
  STATIC const char help_text[] =
      "Welcome to MicroPython!\n"
      "For online docs please visit http://docs.pycom.io\n"
      "\n"
      "Control commands:\n"
      "  CTRL-A        -- on a blank line, enter raw REPL mode\n"
      "  CTRL-B        -- on a blank line, enter normal REPL mode\n"
      "  CTRL-C        -- interrupt a running program\n"
      "  CTRL-D        -- on a blank line, do a soft reset of the board\n"
      "  CTRL-E        -- on a blank line, enter paste mode\n"
      "  CTRL-F        -- on a blank line, do a hard reset of the board and enter safe boot\n"
      "\n"
      "For further help on a specific object, type help(obj)\n";
  
  STATIC void pyb_help_print_info_about_object(mp_obj_t name_o, mp_obj_t value) {
      mp_printf(&mp_plat_print, "  ");
      mp_obj_print(name_o, PRINT_STR);
      mp_printf(&mp_plat_print, " -- ");
      mp_obj_print(value, PRINT_STR);
      mp_printf(&mp_plat_print, "\n");
  }
  
  STATIC mp_obj_t pyb_help(uint n_args, const mp_obj_t *args) {
      if (n_args == 0) {
          // print a general help message
          mp_printf(&mp_plat_print, "%s", help_text);
      }
      else {
          // try to print something sensible about the given object
          mp_printf(&mp_plat_print, "object ");
          mp_obj_print(args[0], PRINT_STR);
          mp_printf(&mp_plat_print, " is of type %s\n", mp_obj_get_type_str(args[0]));
  
          mp_map_t *map = NULL;
          if (MP_OBJ_IS_TYPE(args[0], &mp_type_module)) {
              map = mp_obj_dict_get_map(mp_obj_module_get_globals(args[0]));
          } else {
              mp_obj_type_t *type;
              if (MP_OBJ_IS_TYPE(args[0], &mp_type_type)) {
                  type = args[0];
              } else {
                  type = mp_obj_get_type(args[0]);
              }
              if (type->locals_dict != MP_OBJ_NULL && MP_OBJ_IS_TYPE(type->locals_dict, &mp_type_dict)) {
                  map = mp_obj_dict_get_map(type->locals_dict);
              }
          }
          if (map != NULL) {
              for (uint i = 0; i < map->alloc; i++) {
                  if (map->table[i].key != MP_OBJ_NULL) {
                      pyb_help_print_info_about_object(map->table[i].key, map->table[i].value);
                  }
              }
          }
      }
      return mp_const_none;
  }
  MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mp_builtin_help_obj, 0, 1, pyb_help);
  