// Lua: res = help( [topic] ) static int elua_help( lua_State *L ) { const char *topic = NULL; if( lua_type( L, 1 ) == LUA_TSTRING ) topic = luaL_checkstring( L, 1 ); help_init( HELP_FILE_NAME ); term_set_mode( TERM_MODE_COLS ); term_enable_paging( TERM_PAGING_ON ); help_help( topic ); term_set_mode( TERM_MODE_ASCII ); term_enable_paging( TERM_PAGING_OFF ); help_close(); return 0; }
static int do_showhelp( char **helptopic, char *filename, EVENT (*rtn)( EVENT ), bool first ) { int err; char *ptr; unsigned len; char *htopic; eventMapFn = rtn; helpTab = NULL; helpCur = helpTab; strcpy( curFile, filename ); helpInBuf = HelpMemAlloc( BUF_LEN ); if( helpInBuf == NULL ) { HelpMemFree( helpStack ); return( HELP_NO_MEM ); } helpOutBuf = HelpMemAlloc( BUF_LEN ); if( helpOutBuf == NULL ) { HelpMemFree( helpStack ); return( HELP_NO_MEM ); } // don't fix hyperlink topics if( *helptopic != NULL && first ) { htopic = fixHelpTopic( *helptopic ); } else if( *helptopic == NULL ) { len = 1; htopic = HelpMemAlloc( len ); htopic[0] = '\0'; } else { len = strlen( *helptopic ); htopic = HelpMemAlloc( len + 1 ); strcpy( htopic, *helptopic ); } nexttopic( htopic ); for( ;; ) { err = findhelp( &tabFilter ); if( err != HELP_OK ) break; if( curEvent == EV_ESCAPE ) break; if( curEvent == EV_KILL_UI ) { break; } } SearchDlgFini(); help_close(); // This is Not Nice - we're freeing memory that // someone else allocated! Just don't do it. if( err != HELP_NO_SUBJECT ) { if( *helptopic != NULL ) { HelpMemFree( *helptopic ); *helptopic = NULL; } *filename = '\0'; } HelpMemFree( helpInBuf ); HelpMemFree( helpOutBuf ); HelpMemFree( htopic ); if( helpTab != NULL && helpCur->key2_len != 0 ) { // cross file link len = helpCur->key1_len; *helptopic = ptr = HelpMemAlloc( len + 1 ); strncpy( ptr, helpCur->keyword, len ); ptr[len] = '\0'; ptr = helpCur->keyword + len; len = helpCur->key2_len; strncpy( filename, ptr, len ); filename[len] = '\0'; if( helpCur != tabFilter.curr ) { // backwards through cross file link prevtopic(); } } else { Free_Stack(); } free_fields( &helpTab ); return( err ); }