/** * Search worker. This method was invoked on threads launched from `main`. */ void *search_worker(void *arg) { enum file_type t; worker_params *params = (worker_params *)arg; file_queue_node *current; const size_t out_len = 1024; int utf8_pattern_len = strlen(op.pattern); while (1) { // This worker takes out a search target file from the queue. If the queue is empty, worker // will be waiting until find at least one target file. pthread_mutex_lock(&file_mutex); while ((current = peek_file_for_search(params->queue)) == NULL) { // Break this loop if all files was searched. if (is_complete_scan_file()) { pthread_mutex_unlock(&file_mutex); return NULL; } pthread_cond_wait(&file_cond, &file_mutex); } pthread_mutex_unlock(&file_mutex); // Check file type of the target file, then if it is a binary, we skip it because the hw is // the software in order to search "source code", so searching binary files is not good. int fd = open(current->filename, O_RDONLY); if (fd != -1 && (t = detect_file_type(fd, current->filename)) != FILE_TYPE_BINARY) { char *pattern = op.pattern; // Convert the pattern to appropriate encoding if an encoding of the target file is // not UTF-8. char out[out_len + 1], pattern_len = utf8_pattern_len; if (t == FILE_TYPE_EUC_JP || t == FILE_TYPE_SHIFT_JIS) { if (t == FILE_TYPE_EUC_JP) { to_euc(op.pattern, utf8_pattern_len, out, out_len); } else if (t == FILE_TYPE_SHIFT_JIS) { to_sjis(op.pattern, utf8_pattern_len, out, out_len); } pattern = out; pattern_len = strlen(pattern); } // Searching. match_line_list *match_lines = create_match_line_list(); int match_count = search(fd, pattern, pattern_len, t, match_lines, params->index); if (match_count > 0) { // Set additional data to the queue data because it will be used on print worker in // order to print results to the console. `match_lines` variable will be released // along with the file queue when it is released. current->matched = true; current->match_lines = match_lines; current->t = t; } else { // If the pattern was not matched, the lines queue is no longer needed, so do free. free_match_line_list(match_lines); } } // Wake up print worker. current->searched = true; pthread_cond_signal(&print_cond); close(fd); } return NULL; }
MODULE* FOOTPRINT_EDIT_FRAME::Import_Module( const wxString& aName ) { wxString lastOpenedPathForLoading = m_mruPath; wxConfigBase* cfg = Kiface().KifaceSettings(); if( cfg ) cfg->Read( EXPORT_IMPORT_LASTPATH_KEY, &lastOpenedPathForLoading ); wxFileName fn; if( aName != wxT("") ) fn = aName; else fn = getFootprintFilenameFromUser( this, lastOpenedPathForLoading ); if( !fn.IsOk() ) return NULL; FILE* fp = wxFopen( fn.GetFullPath(), wxT( "rt" ) ); if( !fp ) { wxString msg = wxString::Format( FMT_FILE_NOT_FOUND, GetChars( fn.GetFullPath() ) ); DisplayError( this, msg ); return NULL; } if( cfg ) // Save file path { lastOpenedPathForLoading = fn.GetPath(); cfg->Write( EXPORT_IMPORT_LASTPATH_KEY, lastOpenedPathForLoading ); } wxString moduleName; IO_MGR::PCB_FILE_T fileType = detect_file_type( fp, fn.GetFullPath(), &moduleName ); if( fileType == IO_MGR::FILE_TYPE_NONE ) { DisplayError( this, FMT_NOT_MODULE ); return NULL; } MODULE* module = NULL; try { module = try_load_footprint( fn, fileType, moduleName ); if( !module ) { wxString msg = wxString::Format( FMT_MOD_NOT_FOUND, GetChars( moduleName ), GetChars( fn.GetFullPath() ) ); DisplayError( this, msg ); return NULL; } } catch( const IO_ERROR& ioe ) { DisplayError( this, ioe.What() ); // if the footprint is not loaded, exit. // However, even if an error happens, it can be loaded, because in KICAD and GPCB format, // a fp library is a set of separate files, and the error(s) are not necessary when // reading the selected file if( !module ) return NULL; } module->SetFPID( LIB_ID( wxEmptyString, moduleName ) ); // Insert footprint in list AddModuleToBoard( module ); // Display info : SetMsgPanel( module ); PlaceModule( module, NULL ); if( IsGalCanvasActive() ) module->SetPosition( wxPoint( 0, 0 ) ); GetBoard()->m_Status_Pcb = 0; GetBoard()->BuildListOfNets(); updateView(); return module; }