Warning, /sdk/kde-dev-scripts/fixheaders is written in an unsupported language. File is not indexed.
0001 #! /usr/bin/env perl 0002 0003 # this script is written by Stephan Kulow <coolo@kde.org> with 0004 # much help from Sirtaj Singh Kang <ssk@physics.unimelb.edu.au> 0005 0006 if ($ARGV[0]) { 0007 $topdir = $ARGV[0]; 0008 } else { 0009 $topdir=`pwd`; 0010 } 0011 chomp $topdir; 0012 0013 $lastdir = '.'; 0014 0015 0016 # this is the important part. Left from the '=>' you find the regular 0017 # expression for the g++ output and right from '=>' the header file to 0018 # include 0019 %messages = 0020 ( 0021 'implicit declaration of function `int i18n\(\.\.\.\)\'' => "klocale", 0022 '`i18n\' undeclared \(first use this function\)' => "klocale", 0023 'variable `class QPixmap \S*\' has initializer but incomplete type' => "qpixmap", 0024 '`kapp\' undeclared \(first use this function\)' => "kapplication", 0025 'no matching function for call to `KLocale::' => "klocale", 0026 '`klocale\' undeclared \(first use this function\)' => "klocale", 0027 'no matching function for call to `QPopupMenu::' => "qpopupmenu", 0028 '`QTextStream\' undeclared \(first use this function\)' => "qtextstream", 0029 '`QTextStream\' was not declared in this scope' => "qtextstream", 0030 'incomplete type `QSocketNotifier\'' => "qsocketnotifier", 0031 'no matching function for call to `KConfig' => "kconfig", 0032 'variable `class KConfig \S*\' has initializer but incomplete type' => "kconfig", 0033 'implicit declaration of function `int kDebug' => "kdebug", 0034 'implicit declaration of function `int kWarning' => "kdebug", 0035 '`QFile\' undeclared \(first use this function' => "qfile", 0036 'variable `QFile \S*\' has initializer but incomplete type' => "qfile", 0037 'type `KConfigBase\' is not a base type for type `KConfig' => "kconfig", 0038 'invalid use of undefined type `class QAccel' => "qaccel", 0039 'invalid use of undefined type `class KAboutData' => "kaboutdata", 0040 'incomplete type `KAboutData\'' => "kaboutdata", 0041 'incomplete type `QGrid\'' => "qgrid", 0042 'invalid use of undefined type `class QGrid\'' => "qgrid", 0043 'aggregate `class KConfig \S*\' has incomplete type' => "kconfig", 0044 '`stderr\' undeclared \(first use this function' => "stdio", 0045 'invalid use of undefined type `class KConfig' => "kconfig", 0046 'implicit declaration of function `int f?printf' => "stdio", 0047 'no method `KGlobal::' => "kglobal", 0048 '`KGlobal\' undeclared \(first use this function\)' => "kglobal", 0049 'implicit declaration of function `int locate\(\.\.\.\)' => "kstddirs", 0050 '`locate\' undeclared \(first use this function\)' => "kstddirs", 0051 'no matching function for call to `KStandardDirs' => "kstddirs", 0052 'no method `KStandardDirs::' => "kstddirs", 0053 'variable `class QFile \S*\' has initializer but incomplete type' => "qfile", 0054 'implicit declaration of function `int ICON\(\.\.\.\)' => "kiconloader", 0055 '`QMessageBox\' undeclared \(first use this function\)' => "qmessagebox", 0056 'no matching function for call to `QBoxLayout::QBoxLayout' => "qlayout", 0057 '`QUriDrag\' undeclared \(first use this function\)' => "qdragobject", 0058 '`kDebug\' undeclared \(first use this function\)' => "kdebug", 0059 '`kWarning\' undeclared \(first use this function\)' => "kdebug", 0060 'no matching function for call to `KMenuBar::insertItem\(QString, KPopupMenu' => "kpopupmenu", 0061 'no matching function for call to `KMenuBar::' => "kmenubar", 0062 'invalid use of undefined type `class QPointArray' => "qpointarray", 0063 'variable `QPainter \S*\' has initializer but incomplete type' => "qpainter", 0064 'invalid use of undefined type `class QRegExp' => "qregexp", 0065 'invalid use of undefined type `class QPushButton' => "qpushbutton", 0066 'cannot convert `QPushButton \*\' to `QButton \*' => "qpushbutton", 0067 'invalid use of undefined type `class QButton' => "qbutton", 0068 '`QButton\' undeclared \(first use this function\)' => "qbutton", 0069 'no method `QCursor::pos' => "qcursor", 0070 '`DesktopIcon\' undeclared \(first use this function\)' => "kiconloader", 0071 '`BarIcon\' undeclared \(first use this function\)' => "kiconloader", 0072 '`SmallIcon\' undeclared \(first use this function\)' => "kiconloader", 0073 '`UserIcon\' undeclared \(first use this function\)' => "kiconloader", 0074 'implicit declaration of function `int UserIcon\(...\)\'' => "kiconloader", 0075 '`KIcon\' undeclared \(first use this function\)' => "kiconloader", 0076 'invalid use of undefined type `class KIconLoader' => "kiconloader", 0077 'invalid use of undefined type `class KComponentData' => "kcomponentdata", 0078 'invalid use of undefined type `class KStatusBar\'' => "kstatusbar", 0079 'invalid use of undefined type `class QLabel\'' => "qlabel", 0080 'invalid use of undefined type `class QImage\'' => "qimage", 0081 'invalid use of undefined type `class QImageIO\'' => "qimage", 0082 'invalid use of undefined type `class QLineEdit\'' => "qlineedit", 0083 'invalid use of undefined type `class QComboBox\'' => "qcombobox", 0084 'invalid use of undefined type `class QStyle\'' => "qstyle", 0085 'invalid use of undefined type `class KPopupMenu\'' => "kpopupmenu", 0086 'invalid use of undefined type `class QPopupMenu\'' => "qpopupmenu", 0087 'cannot convert `KPopupMenu \*\' to `QPopupMenu \*' => "kpopupmenu", 0088 'aggregate `QPopupMenu \S*\' has incomplete type' => "qpopupmenu", 0089 'invalid use of undefined type `class KUrl' => "kurl", 0090 'no method `QApplication::' => "qapplication", 0091 'no method `QFile::' => "qfile", 0092 'error: \'Q3CString\' is used as a type' => "q3cstring", 0093 'error: ISO C\+\+ forbids declaration of \`Q3CString\' with' => "q3cstring", 0094 'error: incomplete type \'QPixmap\' cannot be used' => 'qpixmap', 0095 'error: invalid use of undefined type `struct QVector' => 'qvector', 0096 'error: incomplete type `Q3ValueList' => 'q3valuelist', 0097 'error: variable `Q3ValueList<' => 'q3valuelist', 0098 'error: `Q3PointArray\' undeclared' => 'q3pointarray', 0099 'error: invalid use of undefined type \`struct QColor' => 'qcolor', 0100 'error: `QX11Info::' => 'qx11info_x11', 0101 'error: incomplete type \'QX11Info' => 'qx11info_x11', 0102 'error: \'Q3AsciiDi' => 'q3asciidict', 0103 'invalid use of undefined type \'struct KXMLGUIFactory' => 'kxmlguifactory', 0104 'cannot convert \'KXMLGUIFactory*' => 'kxmlguifactory', 0105 'error: \'I18N_NOOP\' was not declared' => 'klocale', 0106 'error: \'i18n\' was not declared' => 'klocale', 0107 'error: incomplete type \'KGlobal' => 'kglobal', 0108 'error: \'KRandom\' has not been declared' => 'krandom', 0109 'error: \‘KStandardAction\’ has not been declared' => 'kstandardaction', 0110 'error: invalid use of undefined type \‘struct KSelectAction' => 'kselectaction', 0111 'invalid use of undefined type \‘struct KToggleAction' => 'ktoggleaction', 0112 'error: invalid use of undefined type \'struct KJobUiDelegate' => 'kjobuidelegate', 0113 'error: invalid use of undefined type \‘struct QLabel' => 'qlabel', 0114 'error: \'KToggleAction\' was not declared in this scope' => 'ktoggleaction', 0115 'invalid use of undefined type ‘struct KActionCollection' => 'kactioncollection', 0116 'forbids declaration of \'KToggleAction\' with no type' => 'ktoggleaction', 0117 'type \'struct KActionMenu' => 'kactionmenu', 0118 'invalid use of undefined type \'struct KAction' => 'kaction', 0119 'invalid use of undefined type ‘struct KAction' => 'kaction', 0120 'invalid use of undefined type ‘struct KSelectAction' => 'kselectaction', 0121 'invalid use of undefined type .struct KFontSizeAction' => 'kfontsizeaction', 0122 'invalid use of undefined type .struct KFontAction' => 'kfontaction', 0123 "invalid use of undefined type .* KIcon" => 'kicon', 0124 ); 0125 0126 # Initial values are simply to get into the while 0127 $exitcode=2; # exit-code from last 'make' command 0128 $addedone=1; # 1 when something has been fixed, means we can try again 0129 0130 while ( $exitcode != 0 && $addedone != 0 ) 0131 { 0132 $addedone = 0; 0133 0134 %changes = (); 0135 open(INPUT,"makeobj -j10 -k 2>&1 |") || die "Couldn't run makeobj"; 0136 while(<INPUT>) 0137 { 0138 if (/make.*Entering directory \`(.+)\'/) { 0139 $lastdir = $1; 0140 $lastdir =~ s/^$topdir\///; 0141 print STDERR "entering $lastdir\n"; 0142 next; 0143 } 0144 if (/^([^:]*):\d*: (.*)$/) { 0145 $file = $1; 0146 $line = $2; 0147 if ($file !~ m,^\/,) { 0148 $file = "$lastdir/$file"; 0149 } 0150 #print STDERR "file=$file $line\n"; 0151 } else { 0152 # This could be a continuation line 0153 if ( defined $line && $line ne "" ) { 0154 $line .= $_; 0155 #print STDERR "file still $file\n"; 0156 #print STDERR "line=$line\n"; 0157 } else { 0158 # Compilation line, or other unparsable line -> ignore 0159 print STDOUT $_; 0160 next; 0161 } 0162 } 0163 0164 #print STDERR "Already having changes for $file\n" if defined($changes{$file}); 0165 next if defined($changes{$file}); 0166 0167 #print STDOUT $_; 0168 0169 foreach $message (keys %messages) { 0170 if ($line =~ /.*$message.*/) { 0171 $changes{$file} = $messages{$message}; 0172 $addedone = fixFile($file, $messages{$message}); 0173 } 0174 } 0175 0176 if (defined($changes{$file})) { $file=""; $line=""; } 0177 } # end of while(<INPUT>) 0178 close(INPUT); 0179 $exitcode=($?>>8); 0180 } # end of main while 0181 0182 sub fixFile 0183 { 0184 my( $file, $adding ) = @_; 0185 0186 my $lastinclude = ""; 0187 my $lastkinclude = ""; 0188 0189 # read file 0190 open ( FILE, "$file" ) || die "Can't read $file"; 0191 0192 my $flines; 0193 my $cpplevel = 0; 0194 0195 while (<FILE>) { 0196 $flines .= $_; 0197 #print "$cpplevel $_"; 0198 if ($_ =~ m/^#if/ && $_ !~ m/^#ifn/) { 0199 $cpplevel = $cpplevel + 1; 0200 } 0201 if ($_ =~ m/^#endif/) { 0202 $cpplevel = $cpplevel - 1; 0203 } 0204 if ($cpplevel == 0 && ($_ =~ m/^(#include\s*[\"<]q\S*\.h[\">]\S*)/ || $_ =~ m/^(#include\s*[\"<]Q\S*[\">]\S*)/)) { 0205 $lastinclude = $1; 0206 } 0207 if ($cpplevel == 0 && $_ =~ m/^(#include\s*<k\S*\.h>\S*)/) { 0208 $lastkinclude = $1; 0209 } 0210 0211 } 0212 0213 close FILE; 0214 0215 $lastinclude = $lastkinclude if (!$lastinclude); 0216 0217 if (!$lastinclude) { 0218 print STDERR "ERROR: no include found in $file! (tried to add $adding.h)\n"; 0219 return 0; 0220 } 0221 0222 if ($flines =~ m/#include\s*[\"<]$adding\.h[\">]\s*\n/) { 0223 print STDERR "ERROR: $adding.h already included in $file!\n"; 0224 return 0; 0225 } 0226 if ($flines =~ /(\n$lastinclude)/) { 0227 $flines =~ s/$lastinclude(.*\n)/$lastinclude$1#include <$adding.h>\n/; 0228 print STDERR "ADDED <$adding.h> after \"$lastinclude\" in $file\n"; 0229 } else { 0230 print STDERR "ERROR: can't find $lastinclude in $file\n"; 0231 return 0; 0232 } 0233 0234 # write file 0235 0236 open( FILE, ">$file" ) || die "Can't write to $file"; 0237 print FILE $flines; 0238 close FILE; 0239 return 1; 0240 }