From 76fb213bf007c3a91c65467254fc261d425781ff Mon Sep 17 00:00:00 2001 From: dickelbeck Date: Sat, 1 Dec 2007 05:53:52 +0000 Subject: [PATCH] 2nd of 3 commits for DrcDialog rework --- common/string.cpp | 478 +++++++++++++++++++++++++--------------------- pcbnew/drc.cpp | 9 +- todo.txt | 8 + 3 files changed, 278 insertions(+), 217 deletions(-) diff --git a/common/string.cpp b/common/string.cpp index f35f314697..d12ea81cb3 100644 --- a/common/string.cpp +++ b/common/string.cpp @@ -9,320 +9,366 @@ /*********************************************************************/ -int ReadDelimitedText(char * dest, char * source, int NbMaxChar ) +int ReadDelimitedText( char* dest, char* source, int NbMaxChar ) /*********************************************************************/ + /* lit et place dans dest la chaine de caractere trouvee dans source, - delimitee par " . - transfere NbMaxChar max - retourne le nombre de codes lus dans source - dest est termine par NULL -*/ + * delimitee par " . + * transfere NbMaxChar max + * retourne le nombre de codes lus dans source + * dest est termine par NULL + */ { -int ii, jj, flag = 0; + int ii, jj, flag = 0; - for ( ii = 0, jj = 0; ii < NbMaxChar - 1 ; jj++, source++) - { - if ( * source == 0 ) break; /* fin de ligne */ - if ( * source == '"' ) /* delimiteur trouve */ - { - if ( flag ) break; /* Fin de texte delimite */ - flag = 1; /* Marque 1er delimiteur trouve */ - } - else if ( flag ) - { - * dest = * source; dest++; ii++; - } - } - *dest = 0; /* Null terminaison */ - return (jj); + for( ii = 0, jj = 0; ii < NbMaxChar - 1; jj++, source++ ) + { + if( *source == 0 ) + break; /* fin de ligne */ + if( *source == '"' ) /* delimiteur trouve */ + { + if( flag ) + break; /* Fin de texte delimite */ + flag = 1; /* Marque 1er delimiteur trouve */ + } + else if( flag ) + { + *dest = *source; dest++; ii++; + } + } + + *dest = 0; /* Null terminaison */ + return jj; } /********************************/ -char * StrPurge(char * text) +char* StrPurge( char* text ) /********************************/ + /* Supprime les caracteres Space en debut de la ligne text - retourne un pointeur sur le 1er caractere non Space de text -*/ + * retourne un pointeur sur le 1er caractere non Space de text + */ { -char * ptspace; - if ( text == NULL ) return NULL; + char* ptspace; - while( (*text <= ' ') && *text ) text++; - ptspace = text + strlen(text) -1; - while( (*ptspace <= ' ') && *ptspace && (ptspace >= text) ) - { - *ptspace = 0; ptspace--; - } - return(text); + if( text == NULL ) + return NULL; + + while( (*text <= ' ') && *text ) + text++; + + ptspace = text + strlen( text ) - 1; + while( (*ptspace <= ' ') && *ptspace && (ptspace >= text) ) + { + *ptspace = 0; ptspace--; + } + + return text; } /*****************************************************************/ -char * GetLine(FILE *File, char *Line, int *LineNum, int SizeLine) +char* GetLine( FILE* File, char* Line, int* LineNum, int SizeLine ) /*****************************************************************/ -/* Routine de lecture de 1 ligne utile - retourne la 1ere ligne utile lue. - elimine lignes vides et commentaires - incremente *LineNum a chaque ligne lue -*/ -{ - do { - if (fgets(Line, SizeLine, File) == NULL) return NULL; - if( LineNum ) *LineNum += 1; - } while (Line[0] == '#' || Line[0] == '\n' || Line[0] == '\r' || - Line[0] == 0); - strtok(Line,"\n\r"); - return Line; +/* Routine de lecture de 1 ligne utile + * retourne la 1ere ligne utile lue. + * elimine lignes vides et commentaires + * incremente *LineNum a chaque ligne lue + */ +{ + do { + if( fgets( Line, SizeLine, File ) == NULL ) + return NULL; + if( LineNum ) + *LineNum += 1; + } while( Line[0] == '#' || Line[0] == '\n' || Line[0] == '\r' + || Line[0] == 0 ); + + strtok( Line, "\n\r" ); + return Line; } /*******************************/ -char * DateAndTime(char * Line) +char* DateAndTime( char* Line ) /*******************************/ /* Retourne la chaine de caractere donnant date+heure */ { -time_t Time_Buf; -struct tm * Date; + time_t Time_Buf; + struct tm* Date; - time(&Time_Buf); - Date = gmtime(&Time_Buf); - sprintf(Line,"%d/%d/%d-%2.2d:%2.2d:%2.2d", - Date->tm_mday, Date->tm_mon + 1, Date->tm_year + 1900, - Date->tm_hour, Date->tm_min, Date->tm_sec ); + time( &Time_Buf ); + Date = gmtime( &Time_Buf ); + sprintf( Line, "%d/%d/%d-%2.2d:%2.2d:%2.2d", + Date->tm_mday, Date->tm_mon + 1, Date->tm_year + 1900, + Date->tm_hour, Date->tm_min, Date->tm_sec ); - return(Line); + return Line; } + /*******************************/ wxString DateAndTime() /*******************************/ /* Retourne la chaine de caractere donnant date+heure */ { -time_t Time_Buf; -struct tm * Date; -wxString Line; + time_t Time_Buf; + struct tm* Date; + wxString Line; - time(&Time_Buf); - Date = gmtime(&Time_Buf); - Line.Printf( wxT("%d/%d/%d-%2.2d:%2.2d:%2.2d"), - Date->tm_mday, Date->tm_mon + 1, Date->tm_year + 1900, - Date->tm_hour, Date->tm_min, Date->tm_sec ); + time( &Time_Buf ); + + Date = gmtime( &Time_Buf ); + + Line.Printf( wxT( "%d/%d/%d-%2.2d:%2.2d:%2.2d" ), + Date->tm_mday, Date->tm_mon + 1, Date->tm_year + 1900, + Date->tm_hour, Date->tm_min, Date->tm_sec ); - return(Line); + return Line; } /************************************************************/ -int StrLenNumCmp(const wxChar *str1,const wxChar *str2, int NbMax) +int StrLenNumCmp( const wxChar* str1, const wxChar* str2, int NbMax ) /************************************************************/ + /* -routine (compatible qsort() ) de comparaison pour classement alphab‚tique -Analogue a strncmp() mais les nombres sont compar‚s selon leur valeur num‚rique -et non pas par leur code ascii -*/ + * routine (compatible qsort() ) de comparaison pour classement alphab‚tique + * Analogue a strncmp() mais les nombres sont compar‚s selon leur valeur num‚rique + * et non pas par leur code ascii + */ { -int i; -int nb1 = 0 , nb2 = 0; + int i; + int nb1 = 0, nb2 = 0; - if( (str1 == NULL) || (str2 == NULL) ) return(0); + if( (str1 == NULL) || (str2 == NULL) ) + return 0; - for ( i = 0 ; i < NbMax ; i++ ) - { - if (isdigit(*str1) && isdigit(*str2) ) /* nombres en jeu */ - { - nb1 = 0 ; nb2 = 0 ; - while (isdigit(*str1)) - { - nb1 = nb1*10 + *str1 -'0'; str1++; - } - while (isdigit(*str2)) - { - nb2 = nb2*10 + *str2 -'0'; str2++; - } - if ( nb1 < nb2 ) return(-1) ; - if ( nb1 > nb2 ) return(1) ; - } + for( i = 0; i < NbMax; i++ ) + { + if( isdigit( *str1 ) && isdigit( *str2 ) ) /* nombres en jeu */ + { + nb1 = 0; nb2 = 0; + while( isdigit( *str1 ) ) + { + nb1 = nb1 * 10 + *str1 - '0'; str1++; + } - if( *str1 < *str2 ) return(-1) ; - if( *str1 > *str2 ) return(1) ; - if( (*str1 == 0 ) && ( *str2 == 0 ) ) return(0) ; - str1++ ; str2++ ; - } + while( isdigit( *str2 ) ) + { + nb2 = nb2 * 10 + *str2 - '0'; str2++; + } - return(0); + if( nb1 < nb2 ) + return -1; + if( nb1 > nb2 ) + return 1; + } + + if( *str1 < *str2 ) + return -1; + if( *str1 > *str2 ) + return 1; + if( (*str1 == 0 ) && ( *str2 == 0 ) ) + return 0; + str1++; str2++; + } + + return 0; } /***********************************************/ -int StrNumICmp(const wxChar *str1,const wxChar *str2) +int StrNumICmp( const wxChar* str1, const wxChar* str2 ) /***********************************************/ + /* -routine (compatible qsort() ) de comparaison pour classement alphabétique, -avec lower case == upper case. -Analogue a stricmp() mais les nombres sont comparés selon leur valeur numérique -et non pas par leur code ascii -*/ + * routine (compatible qsort() ) de comparaison pour classement alphabétique, + * avec lower case == upper case. + * Analogue a stricmp() mais les nombres sont comparés selon leur valeur numérique + * et non pas par leur code ascii + */ { - return StrLenNumICmp( str1, str2, 32735); + return StrLenNumICmp( str1, str2, 32735 ); } /**************************************************************/ -int StrLenNumICmp(const wxChar *str1,const wxChar *str2, int NbMax) +int StrLenNumICmp( const wxChar* str1, const wxChar* str2, int NbMax ) /**************************************************************/ + /* -routine (compatible qsort() ) de comparaison pour classement alphabetique, -avec lower case == upper case. -Analogue a stricmp() mais les nombres sont compares selon leur valeur numerique -et non pas par leur code ascii -*/ + * routine (compatible qsort() ) de comparaison pour classement alphabetique, + * avec lower case == upper case. + * Analogue a stricmp() mais les nombres sont compares selon leur valeur numerique + * et non pas par leur code ascii + */ { -int i; -int nb1 = 0 , nb2 = 0; + int i; + int nb1 = 0, nb2 = 0; - if( (str1 == NULL) || (str2 == NULL) ) return(0); + if( (str1 == NULL) || (str2 == NULL) ) + return 0; - for ( i = 0 ; i < NbMax ; i++ ) - { - if (isdigit(*str1) && isdigit(*str2) ) /* nombres en jeu */ - { - nb1 = 0 ; nb2 = 0 ; - while (isdigit(*str1)) - { - nb1 = nb1*10 + *str1 -'0'; str1++; - } - while (isdigit(*str2)) - { - nb2 = nb2*10 + *str2 -'0'; str2++; - } - if ( nb1 < nb2 ) return(-1) ; - if ( nb1 > nb2 ) return(1) ; - } + for( i = 0; i < NbMax; i++ ) + { + if( isdigit( *str1 ) && isdigit( *str2 ) ) /* nombres en jeu */ + { + nb1 = 0; nb2 = 0; + while( isdigit( *str1 ) ) + { + nb1 = nb1 * 10 + *str1 - '0'; str1++; + } - if( toupper(*str1) < toupper(*str2) ) return(-1) ; - if( toupper(*str1) > toupper(*str2) ) return(1) ; - if( (*str1 == 0 ) && ( *str2 == 0 ) ) return(0) ; - str1++ ; str2++ ; - } + while( isdigit( *str2 ) ) + { + nb2 = nb2 * 10 + *str2 - '0'; str2++; + } - return(0); + if( nb1 < nb2 ) + return -1; + if( nb1 > nb2 ) + return 1; + } + + if( toupper( *str1 ) < toupper( *str2 ) ) + return -1; + if( toupper( *str1 ) > toupper( *str2 ) ) + return 1; + if( (*str1 == 0 ) && ( *str2 == 0 ) ) + return 0; + str1++; str2++; + } + + return 0; } /***********************************************************************/ -bool WildCompareString(const wxString & pattern, const wxString & string_to_tst, - bool case_sensitive ) +bool WildCompareString( const wxString& pattern, const wxString& string_to_tst, + bool case_sensitive ) /***********************************************************************/ + /* compare 2 noms de composants, selon regles usuelles - ( Jokers * , ? , autorisés). - la chaine de reference est "pattern" - si case_sensitive == TRUE, comparaison exacte - retourne TRUE si match - retourne FALSE si differences -*/ + * ( Jokers * , ? , autorisés). + * la chaine de reference est "pattern" + * si case_sensitive == TRUE, comparaison exacte + * retourne TRUE si match + * retourne FALSE si differences + */ { -const wxChar *cp = NULL, *mp = NULL; -const wxChar * wild, * string; -wxString _pattern, _string_to_tst; + const wxChar* cp = NULL, * mp = NULL; + const wxChar* wild, * string; + wxString _pattern, _string_to_tst; - if ( case_sensitive ) - { - wild = pattern.GetData(); string = string_to_tst.GetData(); - } - else - { - _pattern = pattern; _pattern.MakeUpper(); - _string_to_tst = string_to_tst; _string_to_tst.MakeUpper(); - wild = _pattern.GetData(); string = _string_to_tst.GetData(); - } + if( case_sensitive ) + { + wild = pattern.GetData(); string = string_to_tst.GetData(); + } + else + { + _pattern = pattern; _pattern.MakeUpper(); + _string_to_tst = string_to_tst; _string_to_tst.MakeUpper(); + wild = _pattern.GetData(); string = _string_to_tst.GetData(); + } - while ( (*string) && (*wild != '*') ) - { - if ( (*wild != *string) && (*wild != '?') ) return FALSE; - wild++; string++; - } + while( (*string) && (*wild != '*') ) + { + if( (*wild != *string) && (*wild != '?') ) + return FALSE; + wild++; string++; + } - while (*string) - { - if (*wild == '*') - { - if (!*++wild) return 1; - mp = wild; - cp = string+1; - } - else if ((*wild == *string) || (*wild == '?')) - { - wild++; - string++; - } - else - { - wild = mp; - string = cp++; - } - } + while( *string ) + { + if( *wild == '*' ) + { + if( ! * ++wild ) + return 1; + mp = wild; + cp = string + 1; + } + else if( (*wild == *string) || (*wild == '?') ) + { + wild++; + string++; + } + else + { + wild = mp; + string = cp++; + } + } - while (*wild == '*') { - wild++; - } - return !*wild; + while( *wild == '*' ) + { + wild++; + } + + return ! * wild; } + /***********************************************/ -void ChangeSpaces(char * Text, int NewChar) +void ChangeSpaces( char* Text, int NewChar ) /***********************************************/ /* Change dans un texte les espaces en NewChar */ { - if ( Text == NULL ) return; - while( *Text ) - { - if( *Text == ' ') *Text = (char) NewChar; - Text++; - } + if( Text == NULL ) + return; + while( *Text ) + { + if( *Text == ' ' ) + *Text = (char) NewChar; + Text++; + } } - /***************************/ -char * to_point(char * Text) +char* to_point( char* Text ) /**************************/ + /* convertit les , en . dans une chaine. utilisé pour compenser -l'internalisationde la fct printf -qui genere les flottants avec une virgule au lieu du point -*/ + * l'internalisationde la fct printf + * qui genere les flottants avec une virgule au lieu du point + */ { -char * line = Text; + char* line = Text; - if ( Text == NULL ) return NULL; - for ( ; *Text != 0; Text++ ) - { - if (*Text == ',') *Text = '.'; - } + if( Text == NULL ) + return NULL; + for( ; *Text != 0; Text++ ) + { + if( *Text == ',' ) + *Text = '.'; + } - return line; + return line; } /********************************/ -char * strupper(char * Text) +char* strupper( char* Text ) /********************************/ + /* Change les caracteres 'a' ... 'z' en 'A' ... 'Z'. dans la chaine Text. -Retourne Text -*/ + * Retourne Text + */ { -char * code = Text; + char* code = Text; - if( Text ) - { - while( * code) - { - if( (*code >= 'a') && (*code <= 'z') ) *code += 'A' - 'a'; - code ++; - } - } + if( Text ) + { + while( *code ) + { + if( (*code >= 'a') && (*code <= 'z') ) + *code += 'A' - 'a'; + code++; + } + } - return(Text); + return Text; } - diff --git a/pcbnew/drc.cpp b/pcbnew/drc.cpp index 7bcd6a45a1..9e115a35b6 100644 --- a/pcbnew/drc.cpp +++ b/pcbnew/drc.cpp @@ -61,15 +61,20 @@ void WinEDA_PcbFrame::Install_Test_DRC_Frame( wxDC* DC ) void DRC::ShowDialog() { updatePointers(); + bool isNew = false; if( !m_ui ) { m_ui = new DrcDialog( this, m_mainWindow ); + isNew = true; } // @todo enter retentitive member data into the DrcDialog here - m_ui->Show(true); + if( isNew ) + m_ui->Show(true); + else + m_ui->Raise(); // @todo capture the UI entered data into this DRC object. BUT in the OK handler } @@ -226,6 +231,8 @@ void DRC::WriteReport( FILE* fp ) for( int i=0; iGetOPENNETCount(); ++i ) fprintf( fp, m_pcb->GetOPENNET(i)->GetReporter().ShowReport().mb_str() ); */ + + fprintf( fp, "** End of Report **\n" ); } diff --git a/todo.txt b/todo.txt index 73d57ad921..be72e8b923 100644 --- a/todo.txt +++ b/todo.txt @@ -47,6 +47,14 @@ understanding by new developers. Need to do this using DialogBlocks. +2007-Nov-30 Assigned To: nobody +asked by: Dick Hollenbeck +================================================================================ +wxString DateAndTime() +It seems the above function should be using a more user friendly "local time", +not gmtime. + + 2007-Nov-4 Assigned To: dick, but probably not til January. ================================================================================ Enhance DRC dialog box to: