Diffstat (limited to 'development/translation/shared/proparser.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r-- | development/translation/shared/proparser.cpp | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/development/translation/shared/proparser.cpp b/development/translation/shared/proparser.cpp index f616c5a..bb099bb 100644 --- a/development/translation/shared/proparser.cpp +++ b/development/translation/shared/proparser.cpp | |||
@@ -42,133 +42,134 @@ | |||
42 | #endif | 42 | #endif |
43 | 43 | ||
44 | QString loadFile( const QString &fileName ) | 44 | QString loadFile( const QString &fileName ) |
45 | { | 45 | { |
46 | QFile file( fileName ); | 46 | QFile file( fileName ); |
47 | if ( !file.open(IO_ReadOnly) ) { | 47 | if ( !file.open(IO_ReadOnly) ) { |
48 | fprintf( stderr, "error: Cannot load '%s': %s\n", | 48 | fprintf( stderr, "error: Cannot load '%s': %s\n", |
49 | file.name().latin1(), | 49 | file.name().latin1(), |
50 | file.errorString().latin1() ); | 50 | file.errorString().latin1() ); |
51 | return QString(); | 51 | return QString(); |
52 | } | 52 | } |
53 | 53 | ||
54 | QTextStream in( &file ); | 54 | QTextStream in( &file ); |
55 | return in.read(); | 55 | return in.read(); |
56 | } | 56 | } |
57 | 57 | ||
58 | QMap<QString, QString> proFileTagMap( const QString& text, const QString& opieDir ) | 58 | QMap<QString, QString> proFileTagMap( const QString& text, const QString& opieDir ) |
59 | { | 59 | { |
60 | QString t = text; | 60 | QString t = text; |
61 | 61 | ||
62 | /* | 62 | /* |
63 | Process include() commands. | 63 | Process include() commands. |
64 | */ | 64 | */ |
65 | QRegExp callToInclude("include\\s*\\(\\s*([^()\\s]+)\\s*\\)"); | 65 | QRegExp callToInclude("include\\s*\\(\\s*([^()\\s]+)\\s*\\)"); |
66 | int i = 0; | 66 | int i = 0; |
67 | while ( (i = callToInclude.search(t, i)) != -1 ) { | 67 | while ( (i = callToInclude.search(t, i)) != -1 ) { |
68 | QString after = loadFile( callToInclude.cap(1) ); | 68 | QString after = loadFile( callToInclude.cap(1) ); |
69 | t.replace( i, callToInclude.matchedLength(), after ); | 69 | t.replace( i, callToInclude.matchedLength(), after ); |
70 | i += after.length(); | 70 | i += after.length(); |
71 | } | 71 | } |
72 | 72 | ||
73 | /* | 73 | /* |
74 | Strip comments, merge lines ending with backslash, add | 74 | Strip comments, merge lines ending with backslash, add |
75 | spaces around '=' and '+=', replace '\n' with ';', and | 75 | spaces around '=' and '+=', replace '\n' with ';', and |
76 | simplify white spaces. | 76 | simplify white spaces. |
77 | */ | 77 | */ |
78 | t.replace( QRegExp(QString("#[^\n]*\n")), QString(" ") ); | 78 | t.replace( QRegExp(QString("#[^\n]*\n")), QString(" ") ); |
79 | t.replace( QRegExp(QString("\\\\[^\n\\S]*\n")), QString(" ") ); | 79 | t.replace( QRegExp(QString("\\\\[^\n\\S]*\n")), QString(" ") ); |
80 | t.replace( "=", QString(" = ") ); | 80 | t.replace( "=", QString(" = ") ); |
81 | t.replace( "+ =", QString(" += ") ); | 81 | t.replace( "+ =", QString(" += ") ); |
82 | t.replace( "\n", QString(";") ); | 82 | t.replace( "\n", QString(";") ); |
83 | t = t.simplifyWhiteSpace(); | 83 | t = t.simplifyWhiteSpace(); |
84 | 84 | ||
85 | /* | 85 | /* |
86 | Populate tagMap with 'key = value' entries. | 86 | Populate tagMap with 'key = value' entries. |
87 | */ | 87 | */ |
88 | QMap<QString, QString> tagMap; | 88 | QMap<QString, QString> tagMap; |
89 | QStringList lines = QStringList::split( QChar(';'), t ); | 89 | QStringList lines = QStringList::split( QChar(';'), t ); |
90 | QStringList::Iterator line; | 90 | QStringList::Iterator line; |
91 | for ( line = lines.begin(); line != lines.end(); ++line ) { | 91 | for ( line = lines.begin(); line != lines.end(); ++line ) { |
92 | QStringList toks = QStringList::split( QChar(' '), *line ); | 92 | QStringList toks = QStringList::split( QChar(' '), *line ); |
93 | 93 | ||
94 | if ( toks.count() >= 3 && | 94 | if ( toks.count() >= 3 && |
95 | (toks[1] == QString("=") || toks[1] == QString("+=")) ) { | 95 | (toks[1] == QString("=") || toks[1] == QString("+=")) ) { |
96 | QString tag = toks.first(); | 96 | QString tag = toks.first(); |
97 | int k = tag.findRev( QChar(':') ); // as in 'unix:' | 97 | int k = tag.findRev( QChar(':') ); // as in 'unix:' |
98 | if ( k != -1 ) | 98 | if ( k != -1 ) |
99 | tag = tag.mid( k + 1 ); | 99 | tag = tag.mid( k + 1 ); |
100 | toks.remove( toks.begin() ); | 100 | toks.remove( toks.begin() ); |
101 | 101 | ||
102 | QString action = toks.first(); | 102 | QString action = toks.first(); |
103 | toks.remove( toks.begin() ); | 103 | toks.remove( toks.begin() ); |
104 | 104 | ||
105 | if ( tagMap.contains(tag) ) { | 105 | if ( tagMap.contains(tag) ) { |
106 | if ( action == QString("=") ) | 106 | if ( action == QString("=") ) |
107 | tagMap.replace( tag, toks.join(QChar(' ')) ); | 107 | tagMap.replace( tag, toks.join(QChar(' ')) ); |
108 | else | 108 | else |
109 | tagMap[tag] += QChar( ' ' ) + toks.join( QChar(' ') ); | 109 | tagMap[tag] += QChar( ' ' ) + toks.join( QChar(' ') ); |
110 | } else { | 110 | } else { |
111 | tagMap[tag] = toks.join( QChar(' ') ); | 111 | tagMap[tag] = toks.join( QChar(' ') ); |
112 | } | 112 | } |
113 | } | 113 | } |
114 | } | 114 | } |
115 | 115 | ||
116 | /* | 116 | /* |
117 | Expand $$variables within the 'value' part of a 'key = value' | 117 | Expand $$variables within the 'value' part of a 'key = value' |
118 | pair. | 118 | pair. |
119 | */ | 119 | */ |
120 | QRegExp var( "\\$\\$[({]?([a-zA-Z0-9_]+)[)}]?" ); | 120 | QRegExp var( "\\$\\$[({]?([a-zA-Z0-9_]+)[)}]?" ); |
121 | QMap<QString, QString>::Iterator it; | 121 | QMap<QString, QString>::Iterator it; |
122 | for ( it = tagMap.begin(); it != tagMap.end(); ++it ) { | 122 | for ( it = tagMap.begin(); it != tagMap.end(); ++it ) { |
123 | int i = 0; | 123 | int i = 0; |
124 | while ( (i = var.search((*it), i)) != -1 ) { | 124 | while ( (i = var.search((*it), i)) != -1 ) { |
125 | int len = var.matchedLength(); | 125 | int len = var.matchedLength(); |
126 | QString invocation = var.cap(1); | 126 | QString invocation = var.cap(1); |
127 | QString after; | 127 | QString after; |
128 | 128 | ||
129 | if ( invocation == "system" ) { | 129 | if ( invocation == "system" ) { |
130 | // skip system(); it will be handled in the next pass | 130 | // skip system(); it will be handled in the next pass |
131 | ++i; | 131 | ++i; |
132 | } else if ( invocation == "OPIEDIR") { | 132 | } else if ( invocation == "OPIEDIR") { |
133 | (*it).replace( i, len, opieDir ); | 133 | (*it).replace( i, len, opieDir ); |
134 | }else { | 134 | }else { |
135 | if ( tagMap.contains(invocation) ) | 135 | if ( tagMap.contains(invocation) ) |
136 | after = tagMap[invocation]; | 136 | after = tagMap[invocation]; |
137 | (*it).replace( i, len, after ); | 137 | (*it).replace( i, len, after ); |
138 | i += after.length(); | ||
138 | } | 139 | } |
139 | } | 140 | } |
140 | } | 141 | } |
141 | 142 | ||
142 | /* | 143 | /* |
143 | Execute system() calls. | 144 | Execute system() calls. |
144 | */ | 145 | */ |
145 | QRegExp callToSystem( "\\$\\$system\\s*\\(([^()]*)\\)" ); | 146 | QRegExp callToSystem( "\\$\\$system\\s*\\(([^()]*)\\)" ); |
146 | for ( it = tagMap.begin(); it != tagMap.end(); ++it ) { | 147 | for ( it = tagMap.begin(); it != tagMap.end(); ++it ) { |
147 | int i = 0; | 148 | int i = 0; |
148 | while ( (i = callToSystem.search((*it), i)) != -1 ) { | 149 | while ( (i = callToSystem.search((*it), i)) != -1 ) { |
149 | /* | 150 | /* |
150 | This code is stolen from qmake's project.cpp file. | 151 | This code is stolen from qmake's project.cpp file. |
151 | Ideally we would use the same parser, so we wouldn't | 152 | Ideally we would use the same parser, so we wouldn't |
152 | have this code duplication. | 153 | have this code duplication. |
153 | */ | 154 | */ |
154 | QString after; | 155 | QString after; |
155 | char buff[256]; | 156 | char buff[256]; |
156 | FILE *proc = QT_POPEN( callToSystem.cap(1).latin1(), "r" ); | 157 | FILE *proc = QT_POPEN( callToSystem.cap(1).latin1(), "r" ); |
157 | while ( proc && !feof(proc) ) { | 158 | while ( proc && !feof(proc) ) { |
158 | int read_in = fread( buff, 1, 255, proc ); | 159 | int read_in = fread( buff, 1, 255, proc ); |
159 | if ( !read_in ) | 160 | if ( !read_in ) |
160 | break; | 161 | break; |
161 | for ( int i = 0; i < read_in; i++ ) { | 162 | for ( int i = 0; i < read_in; i++ ) { |
162 | if ( buff[i] == '\n' || buff[i] == '\t' ) | 163 | if ( buff[i] == '\n' || buff[i] == '\t' ) |
163 | buff[i] = ' '; | 164 | buff[i] = ' '; |
164 | } | 165 | } |
165 | buff[read_in] = '\0'; | 166 | buff[read_in] = '\0'; |
166 | after += buff; | 167 | after += buff; |
167 | } | 168 | } |
168 | (*it).replace( i, callToSystem.matchedLength(), after ); | 169 | (*it).replace( i, callToSystem.matchedLength(), after ); |
169 | i += after.length(); | 170 | i += after.length(); |
170 | } | 171 | } |
171 | } | 172 | } |
172 | 173 | ||
173 | return tagMap; | 174 | return tagMap; |
174 | } | 175 | } |