author | erik <erik> | 2007-01-22 23:01:41 (UTC) |
---|---|---|
committer | erik <erik> | 2007-01-22 23:01:41 (UTC) |
commit | adcf6075db477909dd8170a74862a6ef91a5127f (patch) (unidiff) | |
tree | da0a1e35c5d392271bce29e84d3af5c30a864f56 | |
parent | 9b4871054d01a47b4c546952a0948553413840d6 (diff) | |
download | opie-adcf6075db477909dd8170a74862a6ef91a5127f.zip opie-adcf6075db477909dd8170a74862a6ef91a5127f.tar.gz opie-adcf6075db477909dd8170a74862a6ef91a5127f.tar.bz2 |
Each file in this commit had a problem where a function might return
a null value for a pointer and that null value was not checked.
-rw-r--r-- | noncore/games/minesweep/minefield.cpp | 4 | ||||
-rw-r--r-- | noncore/net/opieirc/ircsession.cpp | 8 | ||||
-rw-r--r-- | noncore/todayplugins/stockticker/libstocks/csv.c | 3 |
3 files changed, 10 insertions, 5 deletions
diff --git a/noncore/games/minesweep/minefield.cpp b/noncore/games/minesweep/minefield.cpp index 72c05b0..1987ea5 100644 --- a/noncore/games/minesweep/minefield.cpp +++ b/noncore/games/minesweep/minefield.cpp | |||
@@ -1,747 +1,749 @@ | |||
1 | /********************************************************************** | 1 | /********************************************************************** |
2 | ** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. | 2 | ** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. |
3 | ** | 3 | ** |
4 | ** This file is part of the Qtopia Environment. | 4 | ** This file is part of the Qtopia Environment. |
5 | ** | 5 | ** |
6 | ** This file may be distributed and/or modified under the terms of the | 6 | ** This file may be distributed and/or modified under the terms of the |
7 | ** GNU General Public License version 2 as published by the Free Software | 7 | ** GNU General Public License version 2 as published by the Free Software |
8 | ** Foundation and appearing in the file LICENSE.GPL included in the | 8 | ** Foundation and appearing in the file LICENSE.GPL included in the |
9 | ** packaging of this file. | 9 | ** packaging of this file. |
10 | ** | 10 | ** |
11 | ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE | 11 | ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE |
12 | ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. | 12 | ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. |
13 | ** | 13 | ** |
14 | ** See http://www.trolltech.com/gpl/ for GPL licensing information. | 14 | ** See http://www.trolltech.com/gpl/ for GPL licensing information. |
15 | ** | 15 | ** |
16 | ** Contact info@trolltech.com if any conditions of this licensing are | 16 | ** Contact info@trolltech.com if any conditions of this licensing are |
17 | ** not clear to you. | 17 | ** not clear to you. |
18 | ** | 18 | ** |
19 | **********************************************************************/ | 19 | **********************************************************************/ |
20 | #include "minefield.h" | 20 | #include "minefield.h" |
21 | 21 | ||
22 | #include <qtopia/config.h> | 22 | #include <qtopia/config.h> |
23 | #include <qtopia/qpeapplication.h> | 23 | #include <qtopia/qpeapplication.h> |
24 | 24 | ||
25 | #include <qtimer.h> | 25 | #include <qtimer.h> |
26 | 26 | ||
27 | #include <stdlib.h> | 27 | #include <stdlib.h> |
28 | 28 | ||
29 | static const char *pix_flag[]={ | 29 | static const char *pix_flag[]={ |
30 | "13 13 3 1", | 30 | "13 13 3 1", |
31 | "# c #000000", | 31 | "# c #000000", |
32 | "x c #ff0000", | 32 | "x c #ff0000", |
33 | ". c None", | 33 | ". c None", |
34 | ".............", | 34 | ".............", |
35 | ".............", | 35 | ".............", |
36 | ".....#xxxxxx.", | 36 | ".....#xxxxxx.", |
37 | ".....#xxxxxx.", | 37 | ".....#xxxxxx.", |
38 | ".....#xxxxxx.", | 38 | ".....#xxxxxx.", |
39 | ".....#xxxxxx.", | 39 | ".....#xxxxxx.", |
40 | ".....#.......", | 40 | ".....#.......", |
41 | ".....#.......", | 41 | ".....#.......", |
42 | ".....#.......", | 42 | ".....#.......", |
43 | ".....#.......", | 43 | ".....#.......", |
44 | "...#####.....", | 44 | "...#####.....", |
45 | "..#######....", | 45 | "..#######....", |
46 | "............."}; | 46 | "............."}; |
47 | 47 | ||
48 | static const char *pix_mine[]={ | 48 | static const char *pix_mine[]={ |
49 | "13 13 3 1", | 49 | "13 13 3 1", |
50 | "# c #000000", | 50 | "# c #000000", |
51 | ". c None", | 51 | ". c None", |
52 | "a c #ffffff", | 52 | "a c #ffffff", |
53 | "......#......", | 53 | "......#......", |
54 | "......#......", | 54 | "......#......", |
55 | "..#.#####.#..", | 55 | "..#.#####.#..", |
56 | "...#######...", | 56 | "...#######...", |
57 | "..##aa#####..", | 57 | "..##aa#####..", |
58 | "..##aa#####..", | 58 | "..##aa#####..", |
59 | "#############", | 59 | "#############", |
60 | "..#########..", | 60 | "..#########..", |
61 | "..#########..", | 61 | "..#########..", |
62 | "...#######...", | 62 | "...#######...", |
63 | "..#.#####.#..", | 63 | "..#.#####.#..", |
64 | "......#......", | 64 | "......#......", |
65 | "......#......"}; | 65 | "......#......"}; |
66 | 66 | ||
67 | 67 | ||
68 | static const int maxGrid = 28; | 68 | static const int maxGrid = 28; |
69 | static const int minGrid = 12; | 69 | static const int minGrid = 12; |
70 | 70 | ||
71 | 71 | ||
72 | 72 | ||
73 | class Mine : public Qt | 73 | class Mine : public Qt |
74 | { | 74 | { |
75 | public: | 75 | public: |
76 | enum MineState { | 76 | enum MineState { |
77 | Hidden = 0, | 77 | Hidden = 0, |
78 | Empty, | 78 | Empty, |
79 | Mined, | 79 | Mined, |
80 | Flagged, | 80 | Flagged, |
81 | #ifdef MARK_UNSURE | 81 | #ifdef MARK_UNSURE |
82 | Unsure, | 82 | Unsure, |
83 | #endif | 83 | #endif |
84 | Exploded, | 84 | Exploded, |
85 | Wrong | 85 | Wrong |
86 | }; | 86 | }; |
87 | 87 | ||
88 | Mine( MineField* ); | 88 | Mine( MineField* ); |
89 | void paint( QPainter * p, const QColorGroup & cg, const QRect & cr ); | 89 | void paint( QPainter * p, const QColorGroup & cg, const QRect & cr ); |
90 | 90 | ||
91 | QSize sizeHint() const { return QSize( maxGrid, maxGrid ); } | 91 | QSize sizeHint() const { return QSize( maxGrid, maxGrid ); } |
92 | 92 | ||
93 | void activate( bool sure = TRUE ); | 93 | void activate( bool sure = TRUE ); |
94 | void setHint( int ); | 94 | void setHint( int ); |
95 | 95 | ||
96 | void setState( MineState ); | 96 | void setState( MineState ); |
97 | MineState state() const { return st; } | 97 | MineState state() const { return st; } |
98 | 98 | ||
99 | bool isMined() const { return mined; } | 99 | bool isMined() const { return mined; } |
100 | void setMined( bool m ) { mined = m; } | 100 | void setMined( bool m ) { mined = m; } |
101 | 101 | ||
102 | static void paletteChange(); | 102 | static void paletteChange(); |
103 | 103 | ||
104 | private: | 104 | private: |
105 | bool mined; | 105 | bool mined; |
106 | int hint; | 106 | int hint; |
107 | 107 | ||
108 | MineState st; | 108 | MineState st; |
109 | MineField *field; | 109 | MineField *field; |
110 | 110 | ||
111 | static QPixmap* knownField; | 111 | static QPixmap* knownField; |
112 | static QPixmap* unknownField; | 112 | static QPixmap* unknownField; |
113 | static QPixmap* flag_pix; | 113 | static QPixmap* flag_pix; |
114 | static QPixmap* mine_pix; | 114 | static QPixmap* mine_pix; |
115 | }; | 115 | }; |
116 | 116 | ||
117 | QPixmap* Mine::knownField = 0; | 117 | QPixmap* Mine::knownField = 0; |
118 | QPixmap* Mine::unknownField = 0; | 118 | QPixmap* Mine::unknownField = 0; |
119 | QPixmap* Mine::flag_pix = 0; | 119 | QPixmap* Mine::flag_pix = 0; |
120 | QPixmap* Mine::mine_pix = 0; | 120 | QPixmap* Mine::mine_pix = 0; |
121 | 121 | ||
122 | Mine::Mine( MineField *f ) | 122 | Mine::Mine( MineField *f ) |
123 | { | 123 | { |
124 | mined = FALSE; | 124 | mined = FALSE; |
125 | st = Hidden; | 125 | st = Hidden; |
126 | hint = 0; | 126 | hint = 0; |
127 | field = f; | 127 | field = f; |
128 | } | 128 | } |
129 | 129 | ||
130 | void Mine::activate( bool sure ) | 130 | void Mine::activate( bool sure ) |
131 | { | 131 | { |
132 | if ( !sure ) { | 132 | if ( !sure ) { |
133 | switch ( st ) { | 133 | switch ( st ) { |
134 | case Hidden: | 134 | case Hidden: |
135 | setState( Flagged ); | 135 | setState( Flagged ); |
136 | break; | 136 | break; |
137 | case Flagged: | 137 | case Flagged: |
138 | #ifdef MARK_UNSURE | 138 | #ifdef MARK_UNSURE |
139 | setState( Unsure ); | 139 | setState( Unsure ); |
140 | break; | 140 | break; |
141 | case Unsure: | 141 | case Unsure: |
142 | #endif | 142 | #endif |
143 | setState( Hidden ); | 143 | setState( Hidden ); |
144 | default: | 144 | default: |
145 | break; | 145 | break; |
146 | } | 146 | } |
147 | } else if ( st == Flagged ) { | 147 | } else if ( st == Flagged ) { |
148 | return; | 148 | return; |
149 | } else { | 149 | } else { |
150 | if ( mined ) { | 150 | if ( mined ) { |
151 | setState( Exploded ); | 151 | setState( Exploded ); |
152 | } else { | 152 | } else { |
153 | setState( Empty ); | 153 | setState( Empty ); |
154 | } | 154 | } |
155 | } | 155 | } |
156 | } | 156 | } |
157 | 157 | ||
158 | void Mine::setState( MineState s ) | 158 | void Mine::setState( MineState s ) |
159 | { | 159 | { |
160 | st = s; | 160 | st = s; |
161 | } | 161 | } |
162 | 162 | ||
163 | void Mine::setHint( int h ) | 163 | void Mine::setHint( int h ) |
164 | { | 164 | { |
165 | hint = h; | 165 | hint = h; |
166 | } | 166 | } |
167 | 167 | ||
168 | void Mine::paletteChange() | 168 | void Mine::paletteChange() |
169 | { | 169 | { |
170 | delete knownField; | 170 | delete knownField; |
171 | knownField = 0; | 171 | knownField = 0; |
172 | delete unknownField; | 172 | delete unknownField; |
173 | unknownField = 0; | 173 | unknownField = 0; |
174 | delete mine_pix; | 174 | delete mine_pix; |
175 | mine_pix = 0; | 175 | mine_pix = 0; |
176 | delete flag_pix; | 176 | delete flag_pix; |
177 | flag_pix = 0; | 177 | flag_pix = 0; |
178 | } | 178 | } |
179 | 179 | ||
180 | void Mine::paint( QPainter* p, const QColorGroup &cg, const QRect& cr ) | 180 | void Mine::paint( QPainter* p, const QColorGroup &cg, const QRect& cr ) |
181 | { | 181 | { |
182 | int x = cr.x(); | 182 | int x = cr.x(); |
183 | int y = cr.y(); | 183 | int y = cr.y(); |
184 | if ( !knownField || knownField->width() != cr.width() || | 184 | if ( !knownField || knownField->width() != cr.width() || |
185 | knownField->height() != cr.height() ) { | 185 | knownField->height() != cr.height() ) { |
186 | delete knownField; | 186 | delete knownField; |
187 | knownField = new QPixmap( cr.width(), cr.height() ); | 187 | knownField = new QPixmap( cr.width(), cr.height() ); |
188 | QPainter pp( knownField ); | 188 | QPainter pp( knownField ); |
189 | QBrush br( cg.button().dark(115) ); | 189 | QBrush br( cg.button().dark(115) ); |
190 | qDrawWinButton( &pp, QRect( 0, 0, cr.width(), cr.height() ), cg, TRUE, &br ); | 190 | qDrawWinButton( &pp, QRect( 0, 0, cr.width(), cr.height() ), cg, TRUE, &br ); |
191 | } | 191 | } |
192 | 192 | ||
193 | const int pmmarg=cr.width()/5; | 193 | const int pmmarg=cr.width()/5; |
194 | 194 | ||
195 | if ( !unknownField || unknownField->width() != cr.width() || | 195 | if ( !unknownField || unknownField->width() != cr.width() || |
196 | unknownField->height() != cr.height() ) { | 196 | unknownField->height() != cr.height() ) { |
197 | delete unknownField; | 197 | delete unknownField; |
198 | unknownField = new QPixmap( cr.width(), cr.height() ); | 198 | unknownField = new QPixmap( cr.width(), cr.height() ); |
199 | QPainter pp( unknownField ); | 199 | QPainter pp( unknownField ); |
200 | QBrush br( cg.button() ); | 200 | QBrush br( cg.button() ); |
201 | qDrawWinButton( &pp, QRect( 0, 0, cr.width(), cr.height() ), cg, FALSE, &br ); | 201 | qDrawWinButton( &pp, QRect( 0, 0, cr.width(), cr.height() ), cg, FALSE, &br ); |
202 | } | 202 | } |
203 | 203 | ||
204 | if ( !flag_pix || flag_pix->width() != cr.width()-pmmarg*2 || | 204 | if ( !flag_pix || flag_pix->width() != cr.width()-pmmarg*2 || |
205 | flag_pix->height() != cr.height()-pmmarg*2 ) { | 205 | flag_pix->height() != cr.height()-pmmarg*2 ) { |
206 | delete flag_pix; | 206 | delete flag_pix; |
207 | flag_pix = new QPixmap( cr.width()-pmmarg*2, cr.height()-pmmarg*2 ); | 207 | flag_pix = new QPixmap( cr.width()-pmmarg*2, cr.height()-pmmarg*2 ); |
208 | flag_pix->convertFromImage( QImage(pix_flag).smoothScale(cr.width()-pmmarg*2, cr.height()-pmmarg*2) ); | 208 | flag_pix->convertFromImage( QImage(pix_flag).smoothScale(cr.width()-pmmarg*2, cr.height()-pmmarg*2) ); |
209 | } | 209 | } |
210 | 210 | ||
211 | if ( !mine_pix || mine_pix->width() != cr.width()-pmmarg*2 || | 211 | if ( !mine_pix || mine_pix->width() != cr.width()-pmmarg*2 || |
212 | mine_pix->height() != cr.height()-pmmarg*2 ) { | 212 | mine_pix->height() != cr.height()-pmmarg*2 ) { |
213 | delete mine_pix; | 213 | delete mine_pix; |
214 | mine_pix = new QPixmap( cr.width()-pmmarg*2, cr.height()-pmmarg*2 ); | 214 | mine_pix = new QPixmap( cr.width()-pmmarg*2, cr.height()-pmmarg*2 ); |
215 | mine_pix->convertFromImage( QImage(pix_mine).smoothScale(cr.width()-pmmarg*2, cr.height()-pmmarg*2) ); | 215 | mine_pix->convertFromImage( QImage(pix_mine).smoothScale(cr.width()-pmmarg*2, cr.height()-pmmarg*2) ); |
216 | } | 216 | } |
217 | 217 | ||
218 | p->save(); | 218 | p->save(); |
219 | 219 | ||
220 | switch(st) { | 220 | switch(st) { |
221 | case Hidden: | 221 | case Hidden: |
222 | p->drawPixmap( x, y, *unknownField ); | 222 | p->drawPixmap( x, y, *unknownField ); |
223 | break; | 223 | break; |
224 | case Empty: | 224 | case Empty: |
225 | p->drawPixmap( x, y, *knownField ); | 225 | p->drawPixmap( x, y, *knownField ); |
226 | if ( hint > 0 ) { | 226 | if ( hint > 0 ) { |
227 | switch( hint ) { | 227 | switch( hint ) { |
228 | case 1: | 228 | case 1: |
229 | p->setPen( blue ); | 229 | p->setPen( blue ); |
230 | break; | 230 | break; |
231 | case 2: | 231 | case 2: |
232 | p->setPen( green.dark() ); | 232 | p->setPen( green.dark() ); |
233 | break; | 233 | break; |
234 | case 3: | 234 | case 3: |
235 | p->setPen( red ); | 235 | p->setPen( red ); |
236 | break; | 236 | break; |
237 | case 4: | 237 | case 4: |
238 | p->setPen( darkYellow.dark() ); | 238 | p->setPen( darkYellow.dark() ); |
239 | break; | 239 | break; |
240 | case 5: | 240 | case 5: |
241 | p->setPen( darkMagenta ); | 241 | p->setPen( darkMagenta ); |
242 | break; | 242 | break; |
243 | case 6: | 243 | case 6: |
244 | p->setPen( darkRed ); | 244 | p->setPen( darkRed ); |
245 | break; | 245 | break; |
246 | default: | 246 | default: |
247 | p->setPen( black ); | 247 | p->setPen( black ); |
248 | break; | 248 | break; |
249 | } | 249 | } |
250 | p->drawText( cr, AlignHCenter | AlignVCenter, QString::number( hint ) ); | 250 | p->drawText( cr, AlignHCenter | AlignVCenter, QString::number( hint ) ); |
251 | } | 251 | } |
252 | break; | 252 | break; |
253 | case Mined: | 253 | case Mined: |
254 | p->drawPixmap( x, y, *knownField ); | 254 | p->drawPixmap( x, y, *knownField ); |
255 | p->drawPixmap( x+pmmarg, y+pmmarg, *mine_pix ); | 255 | p->drawPixmap( x+pmmarg, y+pmmarg, *mine_pix ); |
256 | break; | 256 | break; |
257 | case Exploded: | 257 | case Exploded: |
258 | p->drawPixmap( x, y, *knownField ); | 258 | p->drawPixmap( x, y, *knownField ); |
259 | p->drawPixmap( x+pmmarg, y+pmmarg, *mine_pix ); | 259 | p->drawPixmap( x+pmmarg, y+pmmarg, *mine_pix ); |
260 | p->setPen( red ); | 260 | p->setPen( red ); |
261 | p->drawText( cr, AlignHCenter | AlignVCenter, "X" ); | 261 | p->drawText( cr, AlignHCenter | AlignVCenter, "X" ); |
262 | break; | 262 | break; |
263 | case Flagged: | 263 | case Flagged: |
264 | p->drawPixmap( x, y, *unknownField ); | 264 | p->drawPixmap( x, y, *unknownField ); |
265 | p->drawPixmap( x+pmmarg, y+pmmarg, *flag_pix ); | 265 | p->drawPixmap( x+pmmarg, y+pmmarg, *flag_pix ); |
266 | break; | 266 | break; |
267 | #ifdef MARK_UNSURE | 267 | #ifdef MARK_UNSURE |
268 | case Unsure: | 268 | case Unsure: |
269 | p->drawPixmap( x, y, *unknownField ); | 269 | p->drawPixmap( x, y, *unknownField ); |
270 | p->drawText( cr, AlignHCenter | AlignVCenter, "?" ); | 270 | p->drawText( cr, AlignHCenter | AlignVCenter, "?" ); |
271 | break; | 271 | break; |
272 | #endif | 272 | #endif |
273 | case Wrong: | 273 | case Wrong: |
274 | p->drawPixmap( x, y, *unknownField ); | 274 | p->drawPixmap( x, y, *unknownField ); |
275 | p->drawPixmap( x+pmmarg, y+pmmarg, *flag_pix ); | 275 | p->drawPixmap( x+pmmarg, y+pmmarg, *flag_pix ); |
276 | p->setPen( red ); | 276 | p->setPen( red ); |
277 | p->drawText( cr, AlignHCenter | AlignVCenter, "X" ); | 277 | p->drawText( cr, AlignHCenter | AlignVCenter, "X" ); |
278 | break; | 278 | break; |
279 | } | 279 | } |
280 | 280 | ||
281 | p->restore(); | 281 | p->restore(); |
282 | } | 282 | } |
283 | 283 | ||
284 | /* | 284 | /* |
285 | MineField implementation | 285 | MineField implementation |
286 | */ | 286 | */ |
287 | 287 | ||
288 | MineField::MineField( QWidget* parent, const char* name ) | 288 | MineField::MineField( QWidget* parent, const char* name ) |
289 | : QScrollView( parent, name ) | 289 | : QScrollView( parent, name ) |
290 | { | 290 | { |
291 | viewport()->setBackgroundMode( NoBackground ); | 291 | viewport()->setBackgroundMode( NoBackground ); |
292 | setState( GameOver ); | 292 | setState( GameOver ); |
293 | 293 | ||
294 | setSizePolicy( QSizePolicy( QSizePolicy::Maximum, QSizePolicy::Maximum ) ); | 294 | setSizePolicy( QSizePolicy( QSizePolicy::Maximum, QSizePolicy::Maximum ) ); |
295 | 295 | ||
296 | setFocusPolicy( QWidget::NoFocus ); | 296 | setFocusPolicy( QWidget::NoFocus ); |
297 | 297 | ||
298 | holdTimer = new QTimer( this ); | 298 | holdTimer = new QTimer( this ); |
299 | connect( holdTimer, SIGNAL( timeout() ), this, SLOT( held() ) ); | 299 | connect( holdTimer, SIGNAL( timeout() ), this, SLOT( held() ) ); |
300 | 300 | ||
301 | flagAction = NoAction; | 301 | flagAction = NoAction; |
302 | ignoreClick = FALSE; | 302 | ignoreClick = FALSE; |
303 | currRow = currCol = -1; | 303 | currRow = currCol = -1; |
304 | minecount=0; | 304 | minecount=0; |
305 | mineguess=0; | 305 | mineguess=0; |
306 | nonminecount=0; | 306 | nonminecount=0; |
307 | cellSize = -1; | 307 | cellSize = -1; |
308 | 308 | ||
309 | numRows = numCols = 0; | 309 | numRows = numCols = 0; |
310 | mines = NULL; | 310 | mines = NULL; |
311 | } | 311 | } |
312 | 312 | ||
313 | MineField::~MineField() | 313 | MineField::~MineField() |
314 | { | 314 | { |
315 | for ( int i = 0; i < numCols*numRows; i++ ) | 315 | for ( int i = 0; i < numCols*numRows; i++ ) |
316 | delete mines[i]; | 316 | delete mines[i]; |
317 | delete[] mines; | 317 | delete[] mines; |
318 | } | 318 | } |
319 | 319 | ||
320 | void MineField::setState( State st ) | 320 | void MineField::setState( State st ) |
321 | { | 321 | { |
322 | stat = st; | 322 | stat = st; |
323 | } | 323 | } |
324 | 324 | ||
325 | void MineField::setup( int level ) | 325 | void MineField::setup( int level ) |
326 | { | 326 | { |
327 | lev = level; | 327 | lev = level; |
328 | setState( Waiting ); | 328 | setState( Waiting ); |
329 | //viewport()->setUpdatesEnabled( FALSE ); | 329 | //viewport()->setUpdatesEnabled( FALSE ); |
330 | 330 | ||
331 | int i; | 331 | int i; |
332 | for ( i = 0; i < numCols*numRows; i++ ) | 332 | for ( i = 0; i < numCols*numRows; i++ ) |
333 | delete mines[i]; | 333 | delete mines[i]; |
334 | delete[] mines; | 334 | delete[] mines; |
335 | 335 | ||
336 | switch( lev ) { | 336 | switch( lev ) { |
337 | case 1: | 337 | case 1: |
338 | numRows = 9 ; | 338 | numRows = 9 ; |
339 | numCols = 9 ; | 339 | numCols = 9 ; |
340 | minecount = 12; | 340 | minecount = 12; |
341 | break; | 341 | break; |
342 | case 2: | 342 | case 2: |
343 | numRows = 13; | 343 | numRows = 13; |
344 | numCols = 13; | 344 | numCols = 13; |
345 | minecount = 33; | 345 | minecount = 33; |
346 | break; | 346 | break; |
347 | case 3: | 347 | case 3: |
348 | numCols = 18; | 348 | numCols = 18; |
349 | numRows = 18; | 349 | numRows = 18; |
350 | minecount = 66 ; | 350 | minecount = 66 ; |
351 | break; | 351 | break; |
352 | } | 352 | } |
353 | mines = new Mine* [numRows*numCols]; | 353 | mines = new Mine* [numRows*numCols]; |
354 | for ( i = 0; i < numCols*numRows; i++ ) | 354 | for ( i = 0; i < numCols*numRows; i++ ) |
355 | mines[i] = new Mine( this ); | 355 | mines[i] = new Mine( this ); |
356 | 356 | ||
357 | 357 | ||
358 | nonminecount = numRows*numCols - minecount; | 358 | nonminecount = numRows*numCols - minecount; |
359 | mineguess = minecount; | 359 | mineguess = minecount; |
360 | emit mineCount( mineguess ); | 360 | emit mineCount( mineguess ); |
361 | Mine::paletteChange(); | 361 | Mine::paletteChange(); |
362 | 362 | ||
363 | if ( availableRect.isValid() ) | 363 | if ( availableRect.isValid() ) |
364 | setCellSize(findCellSize()); | 364 | setCellSize(findCellSize()); |
365 | // viewport()->setUpdatesEnabled( TRUE ); | 365 | // viewport()->setUpdatesEnabled( TRUE ); |
366 | //viewport()->repaint( TRUE ); | 366 | //viewport()->repaint( TRUE ); |
367 | updateContents( 0, 0, numCols*cellSize, numRows*cellSize ); | 367 | updateContents( 0, 0, numCols*cellSize, numRows*cellSize ); |
368 | updateGeometry(); | 368 | updateGeometry(); |
369 | } | 369 | } |
370 | 370 | ||
371 | void MineField::drawContents( QPainter * p, int clipx, int clipy, int clipw, int cliph ) | 371 | void MineField::drawContents( QPainter * p, int clipx, int clipy, int clipw, int cliph ) |
372 | { | 372 | { |
373 | int c1 = clipx / cellSize; | 373 | int c1 = clipx / cellSize; |
374 | int c2 = ( clipx + clipw - 1 ) / cellSize; | 374 | int c2 = ( clipx + clipw - 1 ) / cellSize; |
375 | int r1 = clipy / cellSize; | 375 | int r1 = clipy / cellSize; |
376 | int r2 = ( clipy + cliph - 1 ) / cellSize; | 376 | int r2 = ( clipy + cliph - 1 ) / cellSize; |
377 | 377 | ||
378 | for ( int c = c1; c <= c2 ; c++ ) { | 378 | for ( int c = c1; c <= c2 ; c++ ) { |
379 | for ( int r = r1; r <= r2 ; r++ ) { | 379 | for ( int r = r1; r <= r2 ; r++ ) { |
380 | int x = c * cellSize; | 380 | int x = c * cellSize; |
381 | int y = r * cellSize; | 381 | int y = r * cellSize; |
382 | Mine *m = mine( r, c ); | 382 | Mine *m = mine( r, c ); |
383 | if ( m ) | 383 | if ( m ) |
384 | m->paint( p, colorGroup(), QRect(x, y, cellSize, cellSize ) ); | 384 | m->paint( p, colorGroup(), QRect(x, y, cellSize, cellSize ) ); |
385 | } | 385 | } |
386 | } | 386 | } |
387 | } | 387 | } |
388 | 388 | ||
389 | 389 | ||
390 | // Chicken and egg problem: We need to know how big the parent is | 390 | // Chicken and egg problem: We need to know how big the parent is |
391 | // before we can decide how big to make the table. | 391 | // before we can decide how big to make the table. |
392 | 392 | ||
393 | void MineField::setAvailableRect( const QRect &r ) | 393 | void MineField::setAvailableRect( const QRect &r ) |
394 | { | 394 | { |
395 | availableRect = r; | 395 | availableRect = r; |
396 | int newCellSize = findCellSize(); | 396 | int newCellSize = findCellSize(); |
397 | 397 | ||
398 | 398 | ||
399 | if ( newCellSize == cellSize ) { | 399 | if ( newCellSize == cellSize ) { |
400 | setCellSize( cellSize ); | 400 | setCellSize( cellSize ); |
401 | } else { | 401 | } else { |
402 | viewport()->setUpdatesEnabled( FALSE ); | 402 | viewport()->setUpdatesEnabled( FALSE ); |
403 | setCellSize( newCellSize ); | 403 | setCellSize( newCellSize ); |
404 | viewport()->setUpdatesEnabled( TRUE ); | 404 | viewport()->setUpdatesEnabled( TRUE ); |
405 | viewport()->repaint( TRUE ); | 405 | viewport()->repaint( TRUE ); |
406 | } | 406 | } |
407 | } | 407 | } |
408 | 408 | ||
409 | int MineField::findCellSize() | 409 | int MineField::findCellSize() |
410 | { | 410 | { |
411 | int w = availableRect.width() - 2; | 411 | int w = availableRect.width() - 2; |
412 | int h = availableRect.height() - 2; | 412 | int h = availableRect.height() - 2; |
413 | int cellsize; | 413 | int cellsize; |
414 | 414 | ||
415 | cellsize = QMIN( w/numCols, h/numRows ); | 415 | cellsize = QMIN( w/numCols, h/numRows ); |
416 | cellsize = QMIN( QMAX( cellsize, minGrid ), maxGrid ); | 416 | cellsize = QMIN( QMAX( cellsize, minGrid ), maxGrid ); |
417 | return cellsize; | 417 | return cellsize; |
418 | } | 418 | } |
419 | 419 | ||
420 | 420 | ||
421 | void MineField::setCellSize( int cellsize ) | 421 | void MineField::setCellSize( int cellsize ) |
422 | { | 422 | { |
423 | int b = 2; | 423 | int b = 2; |
424 | 424 | ||
425 | int w2 = cellsize*numCols; | 425 | int w2 = cellsize*numCols; |
426 | int h2 = cellsize*numRows; | 426 | int h2 = cellsize*numRows; |
427 | 427 | ||
428 | int w = QMIN( availableRect.width(), w2+b ); | 428 | int w = QMIN( availableRect.width(), w2+b ); |
429 | int h = QMIN( availableRect.height(), h2+b ); | 429 | int h = QMIN( availableRect.height(), h2+b ); |
430 | 430 | ||
431 | // | 431 | // |
432 | // Don't rely on the change in cellsize to force a resize, | 432 | // Don't rely on the change in cellsize to force a resize, |
433 | // as it's possible to have the same size cells when going | 433 | // as it's possible to have the same size cells when going |
434 | // from a large play area to a small one. | 434 | // from a large play area to a small one. |
435 | // | 435 | // |
436 | resizeContents(w2, h2); | 436 | resizeContents(w2, h2); |
437 | 437 | ||
438 | if ( availableRect.height() < h2 && | 438 | if ( availableRect.height() < h2 && |
439 | availableRect.width() - w > style().scrollBarExtent().width() ) { | 439 | availableRect.width() - w > style().scrollBarExtent().width() ) { |
440 | w += style().scrollBarExtent().width(); | 440 | w += style().scrollBarExtent().width(); |
441 | } | 441 | } |
442 | 442 | ||
443 | setGeometry( availableRect.x() + (availableRect.width()-w)/2, | 443 | setGeometry( availableRect.x() + (availableRect.width()-w)/2, |
444 | availableRect.y() + (availableRect.height()-h)/2, w, h ); | 444 | availableRect.y() + (availableRect.height()-h)/2, w, h ); |
445 | cellSize = cellsize; | 445 | cellSize = cellsize; |
446 | } | 446 | } |
447 | 447 | ||
448 | 448 | ||
449 | void MineField::placeMines() | 449 | void MineField::placeMines() |
450 | { | 450 | { |
451 | int mines = minecount; | 451 | int mines = minecount; |
452 | while ( mines ) { | 452 | while ( mines ) { |
453 | int col = int((double(rand()) / double(RAND_MAX)) * numCols); | 453 | int col = int((double(rand()) / double(RAND_MAX)) * numCols); |
454 | int row = int((double(rand()) / double(RAND_MAX)) * numRows); | 454 | int row = int((double(rand()) / double(RAND_MAX)) * numRows); |
455 | 455 | ||
456 | Mine* m = mine( row, col ); | 456 | Mine* m = mine( row, col ); |
457 | 457 | ||
458 | if ( m && !m->isMined() && m->state() == Mine::Hidden ) { | 458 | if ( m && !m->isMined() && m->state() == Mine::Hidden ) { |
459 | m->setMined( TRUE ); | 459 | m->setMined( TRUE ); |
460 | mines--; | 460 | mines--; |
461 | } | 461 | } |
462 | } | 462 | } |
463 | } | 463 | } |
464 | 464 | ||
465 | 465 | ||
466 | void MineField::updateCell( int r, int c ) | 466 | void MineField::updateCell( int r, int c ) |
467 | { | 467 | { |
468 | updateContents( c*cellSize, r*cellSize, cellSize, cellSize ); | 468 | updateContents( c*cellSize, r*cellSize, cellSize, cellSize ); |
469 | } | 469 | } |
470 | 470 | ||
471 | 471 | ||
472 | void MineField::contentsMousePressEvent( QMouseEvent* e ) | 472 | void MineField::contentsMousePressEvent( QMouseEvent* e ) |
473 | { | 473 | { |
474 | int c = e->pos().x() / cellSize; | 474 | int c = e->pos().x() / cellSize; |
475 | int r = e->pos().y() / cellSize; | 475 | int r = e->pos().y() / cellSize; |
476 | if ( onBoard( r, c ) ) | 476 | if ( onBoard( r, c ) ) |
477 | cellPressed( r, c ); | 477 | cellPressed( r, c ); |
478 | else | 478 | else |
479 | currCol = currRow = -1; | 479 | currCol = currRow = -1; |
480 | } | 480 | } |
481 | 481 | ||
482 | void MineField::contentsMouseReleaseEvent( QMouseEvent* e ) | 482 | void MineField::contentsMouseReleaseEvent( QMouseEvent* e ) |
483 | { | 483 | { |
484 | int c = e->pos().x() / cellSize; | 484 | int c = e->pos().x() / cellSize; |
485 | int r = e->pos().y() / cellSize; | 485 | int r = e->pos().y() / cellSize; |
486 | if ( onBoard( r, c ) && c == currCol && r == currRow ) | 486 | if ( onBoard( r, c ) && c == currCol && r == currRow ) |
487 | cellClicked( r, c ); | 487 | cellClicked( r, c ); |
488 | 488 | ||
489 | 489 | ||
490 | if ( flagAction == FlagNext ) { | 490 | if ( flagAction == FlagNext ) { |
491 | flagAction = NoAction; | 491 | flagAction = NoAction; |
492 | } | 492 | } |
493 | } | 493 | } |
494 | 494 | ||
495 | 495 | ||
496 | 496 | ||
497 | /* | 497 | /* |
498 | state == Waiting means no "hold" | 498 | state == Waiting means no "hold" |
499 | 499 | ||
500 | 500 | ||
501 | */ | 501 | */ |
502 | void MineField::cellPressed( int row, int col ) | 502 | void MineField::cellPressed( int row, int col ) |
503 | { | 503 | { |
504 | if ( state() == GameOver ) | 504 | if ( state() == GameOver ) |
505 | return; | 505 | return; |
506 | currRow = row; | 506 | currRow = row; |
507 | currCol = col; | 507 | currCol = col; |
508 | if ( state() == Playing ) | 508 | if ( state() == Playing ) |
509 | holdTimer->start( 150, TRUE ); | 509 | holdTimer->start( 150, TRUE ); |
510 | } | 510 | } |
511 | 511 | ||
512 | void MineField::held() | 512 | void MineField::held() |
513 | { | 513 | { |
514 | flagAction = FlagNext; | 514 | flagAction = FlagNext; |
515 | updateMine( currRow, currCol ); | 515 | updateMine( currRow, currCol ); |
516 | ignoreClick = TRUE; | 516 | ignoreClick = TRUE; |
517 | } | 517 | } |
518 | 518 | ||
519 | 519 | ||
520 | 520 | ||
521 | 521 | ||
522 | void MineField::keyPressEvent( QKeyEvent* e ) | 522 | void MineField::keyPressEvent( QKeyEvent* e ) |
523 | { | 523 | { |
524 | #if defined(Q_WS_QWS) || defined(_WS_QWS_) | 524 | #if defined(Q_WS_QWS) || defined(_WS_QWS_) |
525 | flagAction = ( e->key() == Key_Up ) ? FlagOn : NoAction; | 525 | flagAction = ( e->key() == Key_Up ) ? FlagOn : NoAction; |
526 | #else | 526 | #else |
527 | flagAction = ( ( e->state() & ShiftButton ) == ShiftButton ) ? FlagOn : NoAction; | 527 | flagAction = ( ( e->state() & ShiftButton ) == ShiftButton ) ? FlagOn : NoAction; |
528 | #endif | 528 | #endif |
529 | } | 529 | } |
530 | 530 | ||
531 | void MineField::keyReleaseEvent( QKeyEvent* ) | 531 | void MineField::keyReleaseEvent( QKeyEvent* ) |
532 | { | 532 | { |
533 | flagAction = NoAction; | 533 | flagAction = NoAction; |
534 | } | 534 | } |
535 | 535 | ||
536 | int MineField::getHint( int row, int col ) | 536 | int MineField::getHint( int row, int col ) |
537 | { | 537 | { |
538 | int hint = 0; | 538 | int hint = 0; |
539 | for ( int c = col-1; c <= col+1; c++ ) | 539 | for ( int c = col-1; c <= col+1; c++ ) |
540 | for ( int r = row-1; r <= row+1; r++ ) { | 540 | for ( int r = row-1; r <= row+1; r++ ) { |
541 | Mine* m = mine( r, c ); | 541 | Mine* m = mine( r, c ); |
542 | if ( m && m->isMined() ) | 542 | if ( m && m->isMined() ) |
543 | hint++; | 543 | hint++; |
544 | } | 544 | } |
545 | 545 | ||
546 | return hint; | 546 | return hint; |
547 | } | 547 | } |
548 | 548 | ||
549 | void MineField::setHint( int row, int col ) | 549 | void MineField::setHint( int row, int col ) |
550 | { | 550 | { |
551 | Mine *m = mine( row, col ); | 551 | Mine *m = mine( row, col ); |
552 | if ( !m ) | 552 | if ( !m ) |
553 | return; | 553 | return; |
554 | 554 | ||
555 | int hint = getHint( row, col ); | 555 | int hint = getHint( row, col ); |
556 | 556 | ||
557 | if ( !hint ) { | 557 | if ( !hint ) { |
558 | for ( int c = col-1; c <= col+1; c++ ) | 558 | for ( int c = col-1; c <= col+1; c++ ) |
559 | for ( int r = row-1; r <= row+1; r++ ) { | 559 | for ( int r = row-1; r <= row+1; r++ ) { |
560 | Mine* m = mine( r, c ); | 560 | Mine* m = mine( r, c ); |
561 | if ( m && m->state() == Mine::Hidden ) { | 561 | if ( m && m->state() == Mine::Hidden ) { |
562 | m->activate( TRUE ); | 562 | m->activate( TRUE ); |
563 | nonminecount--; | 563 | nonminecount--; |
564 | setHint( r, c ); | 564 | setHint( r, c ); |
565 | updateCell( r, c ); | 565 | updateCell( r, c ); |
566 | } | 566 | } |
567 | } | 567 | } |
568 | } | 568 | } |
569 | 569 | ||
570 | m->setHint( hint ); | 570 | m->setHint( hint ); |
571 | updateCell( row, col ); | 571 | updateCell( row, col ); |
572 | } | 572 | } |
573 | 573 | ||
574 | /* | 574 | /* |
575 | Only place mines after first click, since it is pointless to | 575 | Only place mines after first click, since it is pointless to |
576 | kill the player before the game has started. | 576 | kill the player before the game has started. |
577 | */ | 577 | */ |
578 | 578 | ||
579 | void MineField::cellClicked( int row, int col ) | 579 | void MineField::cellClicked( int row, int col ) |
580 | { | 580 | { |
581 | if ( state() == GameOver ) | 581 | if ( state() == GameOver ) |
582 | return; | 582 | return; |
583 | if ( state() == Waiting ) { | 583 | if ( state() == Waiting ) { |
584 | Mine* m = mine( row, col ); | 584 | Mine* m = mine( row, col ); |
585 | if ( !m ) | 585 | if ( !m ) |
586 | return; | 586 | return; |
587 | m->setState( Mine::Empty ); | 587 | m->setState( Mine::Empty ); |
588 | nonminecount--; | 588 | nonminecount--; |
589 | placeMines(); | 589 | placeMines(); |
590 | setState( Playing ); | 590 | setState( Playing ); |
591 | emit gameStarted(); | 591 | emit gameStarted(); |
592 | updateMine( row, col ); | 592 | updateMine( row, col ); |
593 | } else { // state() == Playing | 593 | } else { // state() == Playing |
594 | holdTimer->stop(); | 594 | holdTimer->stop(); |
595 | if ( ignoreClick ) | 595 | if ( ignoreClick ) |
596 | ignoreClick = FALSE; | 596 | ignoreClick = FALSE; |
597 | else | 597 | else |
598 | updateMine( row, col ); | 598 | updateMine( row, col ); |
599 | } | 599 | } |
600 | } | 600 | } |
601 | 601 | ||
602 | void MineField::updateMine( int row, int col ) | 602 | void MineField::updateMine( int row, int col ) |
603 | { | 603 | { |
604 | Mine* m = mine( row, col ); | 604 | Mine* m = mine( row, col ); |
605 | if ( !m ) | 605 | if ( !m ) |
606 | return; | 606 | return; |
607 | 607 | ||
608 | bool wasFlagged = m->state() == Mine::Flagged; | 608 | bool wasFlagged = m->state() == Mine::Flagged; |
609 | bool wasEmpty = m->state() == Mine::Empty; | 609 | bool wasEmpty = m->state() == Mine::Empty; |
610 | 610 | ||
611 | m->activate( flagAction == NoAction ); | 611 | m->activate( flagAction == NoAction ); |
612 | 612 | ||
613 | if ( m->state() == Mine::Exploded ) { | 613 | if ( m->state() == Mine::Exploded ) { |
614 | emit gameOver( FALSE ); | 614 | emit gameOver( FALSE ); |
615 | setState( GameOver ); | 615 | setState( GameOver ); |
616 | return; | 616 | return; |
617 | } else if ( m->state() == Mine::Empty ) { | 617 | } else if ( m->state() == Mine::Empty ) { |
618 | setHint( row, col ); | 618 | setHint( row, col ); |
619 | if ( !wasEmpty ) | 619 | if ( !wasEmpty ) |
620 | nonminecount--; | 620 | nonminecount--; |
621 | } | 621 | } |
622 | 622 | ||
623 | if ( flagAction != NoAction ) { | 623 | if ( flagAction != NoAction ) { |
624 | if ( m->state() == Mine::Flagged ) { | 624 | if ( m->state() == Mine::Flagged ) { |
625 | if (mineguess > 0) { | 625 | if (mineguess > 0) { |
626 | --mineguess; | 626 | --mineguess; |
627 | emit mineCount( mineguess ); | 627 | emit mineCount( mineguess ); |
628 | if ( m->isMined() ) | 628 | if ( m->isMined() ) |
629 | --minecount; | 629 | --minecount; |
630 | } else { | 630 | } else { |
631 | m->setState(Mine::Hidden); | 631 | m->setState(Mine::Hidden); |
632 | } | 632 | } |
633 | } else if ( wasFlagged ) { | 633 | } else if ( wasFlagged ) { |
634 | ++mineguess; | 634 | ++mineguess; |
635 | emit mineCount( mineguess ); | 635 | emit mineCount( mineguess ); |
636 | if ( m->isMined() ) | 636 | if ( m->isMined() ) |
637 | ++minecount; | 637 | ++minecount; |
638 | } | 638 | } |
639 | } | 639 | } |
640 | 640 | ||
641 | updateCell( row, col ); | 641 | updateCell( row, col ); |
642 | 642 | ||
643 | if ( !minecount && !mineguess || !nonminecount ) { | 643 | if ( !minecount && !mineguess || !nonminecount ) { |
644 | emit gameOver( TRUE ); | 644 | emit gameOver( TRUE ); |
645 | setState( GameOver ); | 645 | setState( GameOver ); |
646 | } | 646 | } |
647 | } | 647 | } |
648 | 648 | ||
649 | void MineField::showMines() | 649 | void MineField::showMines() |
650 | { | 650 | { |
651 | for ( int c = 0; c < numCols; c++ ) | 651 | for ( int c = 0; c < numCols; c++ ) |
652 | for ( int r = 0; r < numRows; r++ ) { | 652 | for ( int r = 0; r < numRows; r++ ) { |
653 | Mine* m = mine( r, c ); | 653 | Mine* m = mine( r, c ); |
654 | if ( !m ) | 654 | if ( !m ) |
655 | continue; | 655 | continue; |
656 | if ( m->isMined() && m->state() == Mine::Hidden ) | 656 | if ( m->isMined() && m->state() == Mine::Hidden ) |
657 | m->setState( Mine::Mined ); | 657 | m->setState( Mine::Mined ); |
658 | if ( !m->isMined() && m->state() == Mine::Flagged ) | 658 | if ( !m->isMined() && m->state() == Mine::Flagged ) |
659 | m->setState( Mine::Wrong ); | 659 | m->setState( Mine::Wrong ); |
660 | 660 | ||
661 | updateCell( r, c ); | 661 | updateCell( r, c ); |
662 | } | 662 | } |
663 | } | 663 | } |
664 | 664 | ||
665 | void MineField::paletteChange( const QPalette &o ) | 665 | void MineField::paletteChange( const QPalette &o ) |
666 | { | 666 | { |
667 | Mine::paletteChange(); | 667 | Mine::paletteChange(); |
668 | QScrollView::paletteChange( o ); | 668 | QScrollView::paletteChange( o ); |
669 | } | 669 | } |
670 | 670 | ||
671 | void MineField::writeConfig(Config& cfg) const | 671 | void MineField::writeConfig(Config& cfg) const |
672 | { | 672 | { |
673 | cfg.setGroup("Field"); | 673 | cfg.setGroup("Field"); |
674 | cfg.writeEntry("Level",lev); | 674 | cfg.writeEntry("Level",lev); |
675 | QString grid=""; | 675 | QString grid=""; |
676 | if ( stat == Playing ) { | 676 | if ( stat == Playing ) { |
677 | for ( int x = 0; x < numCols; x++ ) | 677 | for ( int x = 0; x < numCols; x++ ) |
678 | for ( int y = 0; y < numRows; y++ ) { | 678 | for ( int y = 0; y < numRows; y++ ) { |
679 | char code='A'+(x*17+y*101)%21; // Reduce the urge to cheat | 679 | char code='A'+(x*17+y*101)%21; // Reduce the urge to cheat |
680 | const Mine* m = mine( y, x ); | 680 | const Mine* m = mine( y, x ); |
681 | int st = (int)m->state(); if ( m->isMined() ) st+=5; | 681 | int st = (int)m->state(); if ( m->isMined() ) st+=5; |
682 | grid += code + st; | 682 | grid += code + st; |
683 | } | 683 | } |
684 | } | 684 | } |
685 | cfg.writeEntry("Grid",grid); | 685 | cfg.writeEntry("Grid",grid); |
686 | } | 686 | } |
687 | 687 | ||
688 | void MineField::readConfig(Config& cfg) | 688 | void MineField::readConfig(Config& cfg) |
689 | { | 689 | { |
690 | cfg.setGroup("Field"); | 690 | cfg.setGroup("Field"); |
691 | lev = cfg.readNumEntry("Level",1); | 691 | lev = cfg.readNumEntry("Level",1); |
692 | setup(lev); | 692 | setup(lev); |
693 | flagAction = NoAction; | 693 | flagAction = NoAction; |
694 | ignoreClick = FALSE; | 694 | ignoreClick = FALSE; |
695 | currRow = currCol = 0; | 695 | currRow = currCol = 0; |
696 | QString grid = cfg.readEntry("Grid"); | 696 | QString grid = cfg.readEntry("Grid"); |
697 | int x; | 697 | int x; |
698 | if ( !grid.isEmpty() ) { | 698 | if ( !grid.isEmpty() ) { |
699 | int i=0; | 699 | int i=0; |
700 | minecount=0; | 700 | minecount=0; |
701 | mineguess=0; | 701 | mineguess=0; |
702 | for ( x = 0; x < numCols; x++ ) { | 702 | for ( x = 0; x < numCols; x++ ) { |
703 | for ( int y = 0; y < numRows; y++ ) { | 703 | for ( int y = 0; y < numRows; y++ ) { |
704 | char code='A'+(x*17+y*101)%21; // Reduce the urge to cheat | 704 | char code='A'+(x*17+y*101)%21; // Reduce the urge to cheat |
705 | int st = (char)(QChar)grid[i++]-code; | 705 | int st = (char)(QChar)grid[i++]-code; |
706 | Mine* m = mine( y, x ); | 706 | Mine* m = mine( y, x ); |
707 | if (!m) | ||
708 | continue; | ||
707 | if ( st >= 5 ) { | 709 | if ( st >= 5 ) { |
708 | st-=5; | 710 | st-=5; |
709 | m->setMined(TRUE); | 711 | m->setMined(TRUE); |
710 | minecount++; | 712 | minecount++; |
711 | mineguess++; | 713 | mineguess++; |
712 | } | 714 | } |
713 | m->setState((Mine::MineState)st); | 715 | m->setState((Mine::MineState)st); |
714 | switch ( m->state() ) { | 716 | switch ( m->state() ) { |
715 | case Mine::Flagged: | 717 | case Mine::Flagged: |
716 | if (m->isMined()) | 718 | if (m->isMined()) |
717 | minecount--; | 719 | minecount--; |
718 | mineguess--; | 720 | mineguess--; |
719 | break; | 721 | break; |
720 | case Mine::Empty: | 722 | case Mine::Empty: |
721 | --nonminecount; | 723 | --nonminecount; |
722 | break; | 724 | break; |
723 | default: | 725 | default: |
724 | break; | 726 | break; |
725 | } | 727 | } |
726 | } | 728 | } |
727 | } | 729 | } |
728 | for ( x = 0; x < numCols; x++ ) { | 730 | for ( x = 0; x < numCols; x++ ) { |
729 | for ( int y = 0; y < numRows; y++ ) { | 731 | for ( int y = 0; y < numRows; y++ ) { |
730 | Mine* m = mine( y, x ); | 732 | Mine* m = mine( y, x ); |
731 | if ( m->state() == Mine::Empty ) | 733 | if ( m && m->state() == Mine::Empty ) |
732 | m->setHint(getHint(y,x)); | 734 | m->setHint(getHint(y,x)); |
733 | } | 735 | } |
734 | } | 736 | } |
735 | } | 737 | } |
736 | setState( Playing ); | 738 | setState( Playing ); |
737 | emit mineCount( mineguess ); | 739 | emit mineCount( mineguess ); |
738 | } | 740 | } |
739 | 741 | ||
740 | QSize MineField::sizeHint() const | 742 | QSize MineField::sizeHint() const |
741 | { | 743 | { |
742 | if ( qApp->desktop()->width() >= 240 ) | 744 | if ( qApp->desktop()->width() >= 240 ) |
743 | return QSize(200,200); | 745 | return QSize(200,200); |
744 | else | 746 | else |
745 | return QSize(160, 160); | 747 | return QSize(160, 160); |
746 | } | 748 | } |
747 | 749 | ||
diff --git a/noncore/net/opieirc/ircsession.cpp b/noncore/net/opieirc/ircsession.cpp index c8d7869..d87ff80 100644 --- a/noncore/net/opieirc/ircsession.cpp +++ b/noncore/net/opieirc/ircsession.cpp | |||
@@ -1,216 +1,218 @@ | |||
1 | 1 | ||
2 | #include "ircsession.h" | 2 | #include "ircsession.h" |
3 | #include "ircmessageparser.h" | 3 | #include "ircmessageparser.h" |
4 | #include "ircchannelperson.h" | 4 | #include "ircchannelperson.h" |
5 | #include "ircversion.h" | 5 | #include "ircversion.h" |
6 | 6 | ||
7 | IRCSession::IRCSession(QObject *parent, IRCServer *server) | 7 | IRCSession::IRCSession(QObject *parent, IRCServer *server) |
8 | : QObject(parent) | 8 | : QObject(parent) |
9 | { | 9 | { |
10 | m_server = server; | 10 | m_server = server; |
11 | m_connection = new IRCConnection(m_server); | 11 | m_connection = new IRCConnection(m_server); |
12 | m_parser = new IRCMessageParser(this); | 12 | m_parser = new IRCMessageParser(this); |
13 | connect(m_connection, SIGNAL(messageArrived(IRCMessage*)), this, SLOT(handleMessage(IRCMessage*))); | 13 | connect(m_connection, SIGNAL(messageArrived(IRCMessage*)), this, SLOT(handleMessage(IRCMessage*))); |
14 | connect(m_parser, SIGNAL(outputReady(IRCOutput)), this, SIGNAL(outputReady(IRCOutput))); | 14 | connect(m_parser, SIGNAL(outputReady(IRCOutput)), this, SIGNAL(outputReady(IRCOutput))); |
15 | connect(m_connection, SIGNAL(outputReady(IRCOutput)), this, SIGNAL(outputReady(IRCOutput))); | 15 | connect(m_connection, SIGNAL(outputReady(IRCOutput)), this, SIGNAL(outputReady(IRCOutput))); |
16 | } | 16 | } |
17 | 17 | ||
18 | IRCSession::~IRCSession() { | 18 | IRCSession::~IRCSession() { |
19 | /* We want this to get deleted automatically */ | 19 | /* We want this to get deleted automatically */ |
20 | m_channels.setAutoDelete(TRUE); | 20 | m_channels.setAutoDelete(TRUE); |
21 | m_people.setAutoDelete(TRUE); | 21 | m_people.setAutoDelete(TRUE); |
22 | 22 | ||
23 | delete m_parser; | 23 | delete m_parser; |
24 | delete m_connection; | 24 | delete m_connection; |
25 | } | 25 | } |
26 | 26 | ||
27 | void IRCSession::beginSession() { | 27 | void IRCSession::beginSession() { |
28 | m_connection->doConnect(); | 28 | m_connection->doConnect(); |
29 | } | 29 | } |
30 | 30 | ||
31 | void IRCSession::join(QString channelname) { | 31 | void IRCSession::join(QString channelname) { |
32 | m_connection->sendLine("JOIN " + channelname); | 32 | m_connection->sendLine("JOIN " + channelname); |
33 | } | 33 | } |
34 | 34 | ||
35 | void IRCSession::quit(){ | 35 | void IRCSession::quit(){ |
36 | m_connection->sendLine("QUIT :[OI] I'm too good to need a reason"); | 36 | m_connection->sendLine("QUIT :[OI] I'm too good to need a reason"); |
37 | } | 37 | } |
38 | 38 | ||
39 | void IRCSession::quit(QString message){ | 39 | void IRCSession::quit(QString message){ |
40 | m_connection->sendLine("QUIT :" + message); | 40 | m_connection->sendLine("QUIT :" + message); |
41 | } | 41 | } |
42 | 42 | ||
43 | void IRCSession::topic(IRCChannel *channel, QString message){ | 43 | void IRCSession::topic(IRCChannel *channel, QString message){ |
44 | m_connection->sendLine("TOPIC :" + channel->channelname() + " " + message); | 44 | m_connection->sendLine("TOPIC :" + channel->channelname() + " " + message); |
45 | } | 45 | } |
46 | 46 | ||
47 | void IRCSession::mode(IRCChannel *channel, QString message){ | 47 | void IRCSession::mode(IRCChannel *channel, QString message){ |
48 | m_connection->sendLine("MODE " + channel->channelname() + " " + message); | 48 | m_connection->sendLine("MODE " + channel->channelname() + " " + message); |
49 | } | 49 | } |
50 | 50 | ||
51 | void IRCSession::mode(IRCPerson *person, QString message){ | 51 | void IRCSession::mode(IRCPerson *person, QString message){ |
52 | m_connection->sendLine("MODE " + person->nick() + " " + message); | 52 | m_connection->sendLine("MODE " + person->nick() + " " + message); |
53 | } | 53 | } |
54 | 54 | ||
55 | void IRCSession::mode(QString message){ | 55 | void IRCSession::mode(QString message){ |
56 | m_connection->sendLine("MODE " + message); | 56 | m_connection->sendLine("MODE " + message); |
57 | } | 57 | } |
58 | 58 | ||
59 | void IRCSession::raw(QString message){ | 59 | void IRCSession::raw(QString message){ |
60 | m_connection->sendLine(message); | 60 | m_connection->sendLine(message); |
61 | } | 61 | } |
62 | 62 | ||
63 | void IRCSession::kick(IRCChannel *channel, IRCPerson *person) { | 63 | void IRCSession::kick(IRCChannel *channel, IRCPerson *person) { |
64 | m_connection->sendLine("KICK " + channel->channelname() + " " + person->nick() +" :0wn3d - no reason"); | 64 | m_connection->sendLine("KICK " + channel->channelname() + " " + person->nick() +" :0wn3d - no reason"); |
65 | } | 65 | } |
66 | 66 | ||
67 | void IRCSession::op(IRCChannel *channel, IRCPerson *person) { | 67 | void IRCSession::op(IRCChannel *channel, IRCPerson *person) { |
68 | m_connection->sendLine("MODE " + channel->channelname() + " +ooo " + person->nick()); | 68 | m_connection->sendLine("MODE " + channel->channelname() + " +ooo " + person->nick()); |
69 | } | 69 | } |
70 | 70 | ||
71 | void IRCSession::kick(IRCChannel *channel, IRCPerson *person, QString message) { | 71 | void IRCSession::kick(IRCChannel *channel, IRCPerson *person, QString message) { |
72 | m_connection->sendLine("KICK " + channel->channelname() + " " + person->nick() +" :" + message); | 72 | m_connection->sendLine("KICK " + channel->channelname() + " " + person->nick() +" :" + message); |
73 | } | 73 | } |
74 | 74 | ||
75 | void IRCSession::sendMessage(IRCPerson *person, QString message) { | 75 | void IRCSession::sendMessage(IRCPerson *person, QString message) { |
76 | m_connection->sendLine("PRIVMSG " + person->nick() + " :" + message); | 76 | m_connection->sendLine("PRIVMSG " + person->nick() + " :" + message); |
77 | } | 77 | } |
78 | 78 | ||
79 | void IRCSession::sendMessage(IRCChannel *channel, QString message) { | 79 | void IRCSession::sendMessage(IRCChannel *channel, QString message) { |
80 | m_connection->sendLine("PRIVMSG " + channel->channelname() + " :" + message); | 80 | m_connection->sendLine("PRIVMSG " + channel->channelname() + " :" + message); |
81 | } | 81 | } |
82 | 82 | ||
83 | void IRCSession::sendAction(IRCChannel *channel, QString message) { | 83 | void IRCSession::sendAction(IRCChannel *channel, QString message) { |
84 | m_connection->sendLine("PRIVMSG " + channel->channelname() + " :\001ACTION " + message + "\001"); | 84 | m_connection->sendLine("PRIVMSG " + channel->channelname() + " :\001ACTION " + message + "\001"); |
85 | } | 85 | } |
86 | 86 | ||
87 | void IRCSession::sendAction(IRCPerson *person, QString message) { | 87 | void IRCSession::sendAction(IRCPerson *person, QString message) { |
88 | m_connection->sendLine("PRIVMSG " + person->nick() + " :\001ACTION " + message + "\001"); | 88 | m_connection->sendLine("PRIVMSG " + person->nick() + " :\001ACTION " + message + "\001"); |
89 | } | 89 | } |
90 | 90 | ||
91 | bool IRCSession::isSessionActive() { | 91 | bool IRCSession::isSessionActive() { |
92 | return m_connection->isConnected(); | 92 | return m_connection->isConnected(); |
93 | } | 93 | } |
94 | 94 | ||
95 | bool IRCSession::isLoggedIn() { | 95 | bool IRCSession::isLoggedIn() { |
96 | return m_connection->isLoggedIn(); | 96 | return m_connection->isLoggedIn(); |
97 | } | 97 | } |
98 | 98 | ||
99 | void IRCSession::endSession() { | 99 | void IRCSession::endSession() { |
100 | if (m_connection->isLoggedIn()) | 100 | if (m_connection->isLoggedIn()) |
101 | quit(APP_VERSION); | 101 | quit(APP_VERSION); |
102 | else | 102 | else |
103 | m_connection->close(); | 103 | m_connection->close(); |
104 | } | 104 | } |
105 | 105 | ||
106 | void IRCSession::part(IRCChannel *channel) { | 106 | void IRCSession::part(IRCChannel *channel) { |
107 | m_connection->sendLine("PART " + channel->channelname() + " :" + APP_VERSION); | 107 | m_connection->sendLine("PART " + channel->channelname() + " :" + APP_VERSION); |
108 | } | 108 | } |
109 | 109 | ||
110 | void IRCSession::setValidUsermodes(const QString &modes) { | 110 | void IRCSession::setValidUsermodes(const QString &modes) { |
111 | m_validUsermodes = modes; | 111 | m_validUsermodes = modes; |
112 | } | 112 | } |
113 | 113 | ||
114 | void IRCSession::setValidChannelmodes(const QString &modes) { | 114 | void IRCSession::setValidChannelmodes(const QString &modes) { |
115 | m_validChannelmodes = modes; | 115 | m_validChannelmodes = modes; |
116 | } | 116 | } |
117 | 117 | ||
118 | void IRCSession::updateNickname(const QString &oldNickname, const QString &newNickname) { | 118 | void IRCSession::updateNickname(const QString &oldNickname, const QString &newNickname) { |
119 | QList<IRCChannel> channels; | 119 | QList<IRCChannel> channels; |
120 | IRCOutput output; | 120 | IRCOutput output; |
121 | 121 | ||
122 | if (oldNickname == m_server->nick()) { | 122 | if (oldNickname == m_server->nick()) { |
123 | m_server->setNick(newNickname); | 123 | m_server->setNick(newNickname); |
124 | output = IRCOutput(OUTPUT_NICKCHANGE, tr("You are now known as %1").arg(newNickname)); | 124 | output = IRCOutput(OUTPUT_NICKCHANGE, tr("You are now known as %1").arg(newNickname)); |
125 | channels = m_channels; | 125 | channels = m_channels; |
126 | } | 126 | } |
127 | 127 | ||
128 | else { | 128 | else { |
129 | IRCPerson *person = getPerson(oldNickname); | 129 | IRCPerson *person = getPerson(oldNickname); |
130 | 130 | ||
131 | if(!person) { | 131 | if(!person) { |
132 | emit outputReady(IRCOutput(OUTPUT_ERROR, tr("Nickname change of an unknown person"))); | 132 | emit outputReady(IRCOutput(OUTPUT_ERROR, tr("Nickname change of an unknown person"))); |
133 | return; | 133 | return; |
134 | } | 134 | } |
135 | 135 | ||
136 | getChannelsByPerson(person, channels); | 136 | getChannelsByPerson(person, channels); |
137 | output = IRCOutput(OUTPUT_NICKCHANGE, tr("%1 is now known as %2").arg(oldNickname).arg(newNickname)); | 137 | output = IRCOutput(OUTPUT_NICKCHANGE, tr("%1 is now known as %2").arg(oldNickname).arg(newNickname)); |
138 | } | 138 | } |
139 | 139 | ||
140 | QListIterator<IRCChannel> it(channels); | 140 | QListIterator<IRCChannel> it(channels); |
141 | for (;it.current(); ++it) { | 141 | for (;it.current(); ++it) { |
142 | IRCChannelPerson *chanperson = it.current()->getPerson(oldNickname); | 142 | IRCChannelPerson *chanperson = it.current()->getPerson(oldNickname); |
143 | it.current()->removePerson(chanperson); | 143 | if (chanperson) { |
144 | chanperson->setNick(newNickname); | 144 | it.current()->removePerson(chanperson); |
145 | it.current()->addPerson(chanperson); | 145 | chanperson->setNick(newNickname); |
146 | it.current()->addPerson(chanperson); | ||
147 | } | ||
146 | } | 148 | } |
147 | 149 | ||
148 | emit updateChannels(); | 150 | emit updateChannels(); |
149 | output.addParam(new QString(newNickname)); | 151 | output.addParam(new QString(newNickname)); |
150 | emit outputReady(output); | 152 | emit outputReady(output); |
151 | } | 153 | } |
152 | 154 | ||
153 | IRCChannel *IRCSession::getChannel(QString channelname) { | 155 | IRCChannel *IRCSession::getChannel(QString channelname) { |
154 | QListIterator<IRCChannel> it(m_channels); | 156 | QListIterator<IRCChannel> it(m_channels); |
155 | for (; it.current(); ++it) { | 157 | for (; it.current(); ++it) { |
156 | if (it.current()->channelname() == channelname) { | 158 | if (it.current()->channelname() == channelname) { |
157 | return it.current(); | 159 | return it.current(); |
158 | } | 160 | } |
159 | } | 161 | } |
160 | return 0; | 162 | return 0; |
161 | } | 163 | } |
162 | 164 | ||
163 | IRCPerson *IRCSession::getPerson(QString nickname) { | 165 | IRCPerson *IRCSession::getPerson(QString nickname) { |
164 | QListIterator<IRCPerson> it(m_people); | 166 | QListIterator<IRCPerson> it(m_people); |
165 | for (; it.current(); ++it) { | 167 | for (; it.current(); ++it) { |
166 | if (it.current()->nick() == nickname) { | 168 | if (it.current()->nick() == nickname) { |
167 | return it.current(); | 169 | return it.current(); |
168 | } | 170 | } |
169 | } | 171 | } |
170 | return 0; | 172 | return 0; |
171 | } | 173 | } |
172 | 174 | ||
173 | void IRCSession::getChannelsByPerson(IRCPerson *person, QList<IRCChannel> &channels) { | 175 | void IRCSession::getChannelsByPerson(IRCPerson *person, QList<IRCChannel> &channels) { |
174 | QListIterator<IRCChannel> it(m_channels); | 176 | QListIterator<IRCChannel> it(m_channels); |
175 | for (; it.current(); ++it) { | 177 | for (; it.current(); ++it) { |
176 | if (it.current()->getPerson(person->nick()) != 0) { | 178 | if (it.current()->getPerson(person->nick()) != 0) { |
177 | channels.append(it.current()); | 179 | channels.append(it.current()); |
178 | } | 180 | } |
179 | } | 181 | } |
180 | } | 182 | } |
181 | 183 | ||
182 | void IRCSession::addPerson(IRCPerson *person) { | 184 | void IRCSession::addPerson(IRCPerson *person) { |
183 | m_people.append(person); | 185 | m_people.append(person); |
184 | } | 186 | } |
185 | 187 | ||
186 | void IRCSession::addChannel(IRCChannel *channel) { | 188 | void IRCSession::addChannel(IRCChannel *channel) { |
187 | m_channels.append(channel); | 189 | m_channels.append(channel); |
188 | } | 190 | } |
189 | 191 | ||
190 | void IRCSession::removeChannel(IRCChannel *channel) { | 192 | void IRCSession::removeChannel(IRCChannel *channel) { |
191 | m_channels.remove(channel); | 193 | m_channels.remove(channel); |
192 | } | 194 | } |
193 | 195 | ||
194 | void IRCSession::removePerson(IRCPerson *person) { | 196 | void IRCSession::removePerson(IRCPerson *person) { |
195 | m_people.remove(person); | 197 | m_people.remove(person); |
196 | } | 198 | } |
197 | 199 | ||
198 | void IRCSession::handleMessage(IRCMessage *message) { | 200 | void IRCSession::handleMessage(IRCMessage *message) { |
199 | m_parser->parse(message); | 201 | m_parser->parse(message); |
200 | } | 202 | } |
201 | 203 | ||
202 | void IRCSession::whois(const QString &nickname) { | 204 | void IRCSession::whois(const QString &nickname) { |
203 | m_connection->whois(nickname); | 205 | m_connection->whois(nickname); |
204 | } | 206 | } |
205 | 207 | ||
206 | void IRCSession::sendCTCPPing(const QString &nickname) { | 208 | void IRCSession::sendCTCPPing(const QString &nickname) { |
207 | m_connection->sendCTCPPing(nickname); | 209 | m_connection->sendCTCPPing(nickname); |
208 | } | 210 | } |
209 | 211 | ||
210 | void IRCSession::sendCTCPRequest(const QString &nickname, const QString &type, const QString &args) { | 212 | void IRCSession::sendCTCPRequest(const QString &nickname, const QString &type, const QString &args) { |
211 | m_connection->sendCTCPRequest(nickname, type, args); | 213 | m_connection->sendCTCPRequest(nickname, type, args); |
212 | } | 214 | } |
213 | 215 | ||
214 | void IRCSession::sendCTCPReply(const QString &nickname, const QString &type, const QString &args) { | 216 | void IRCSession::sendCTCPReply(const QString &nickname, const QString &type, const QString &args) { |
215 | m_connection->sendCTCPReply(nickname, type, args); | 217 | m_connection->sendCTCPReply(nickname, type, args); |
216 | } | 218 | } |
diff --git a/noncore/todayplugins/stockticker/libstocks/csv.c b/noncore/todayplugins/stockticker/libstocks/csv.c index 6170bed..86d8607 100644 --- a/noncore/todayplugins/stockticker/libstocks/csv.c +++ b/noncore/todayplugins/stockticker/libstocks/csv.c | |||
@@ -1,405 +1,406 @@ | |||
1 | /* libstocks - Library to get current stock quotes from Yahoo Finance | 1 | /* libstocks - Library to get current stock quotes from Yahoo Finance |
2 | * | 2 | * |
3 | * Copyright (C) 2000 Eric Laeuffer | 3 | * Copyright (C) 2000 Eric Laeuffer |
4 | * | 4 | * |
5 | * This library is free software; you can redistribute it and/or | 5 | * This library is free software; you can redistribute it and/or |
6 | * modify it under the terms of the GNU Library General Public | 6 | * modify it under the terms of the GNU Library General Public |
7 | * License as published by the Free Software Foundation; either | 7 | * License as published by the Free Software Foundation; either |
8 | * version 2 of the License, or (at your option) any later version. | 8 | * version 2 of the License, or (at your option) any later version. |
9 | * | 9 | * |
10 | * This library is distributed in the hope that it will be useful, | 10 | * This library is distributed in the hope that it will be useful, |
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
13 | * Library General Public License for more details. | 13 | * Library General Public License for more details. |
14 | * | 14 | * |
15 | * You should have received a copy of the GNU Library General Public | 15 | * You should have received a copy of the GNU Library General Public |
16 | * License along with this library; if not, write to the | 16 | * License along with this library; if not, write to the |
17 | * Free Software Foundation, Inc., 59 Temple Place - Suite 330, | 17 | * Free Software Foundation, Inc., 59 Temple Place - Suite 330, |
18 | * Boston, MA 02111-1307, USA. | 18 | * Boston, MA 02111-1307, USA. |
19 | */ | 19 | */ |
20 | 20 | ||
21 | #define __CSV_C__ | 21 | #define __CSV_C__ |
22 | #ifndef __UNIX__ | 22 | #ifndef __UNIX__ |
23 | #define __UNIX__ | 23 | #define __UNIX__ |
24 | #endif | 24 | #endif |
25 | 25 | ||
26 | #include <string.h> | 26 | #include <string.h> |
27 | #include <stdlib.h> | 27 | #include <stdlib.h> |
28 | #include <stdio.h> | 28 | #include <stdio.h> |
29 | 29 | ||
30 | #ifdef __WINDOWS__ | 30 | #ifdef __WINDOWS__ |
31 | #include <mbstring.h> | 31 | #include <mbstring.h> |
32 | #endif | 32 | #endif |
33 | 33 | ||
34 | #include "csv.h" | 34 | #include "csv.h" |
35 | #include "stocks.h" | 35 | #include "stocks.h" |
36 | #include "lists.h" | 36 | #include "lists.h" |
37 | 37 | ||
38 | #define DATE_LENGTH 7 /*YYMMDD*/ | 38 | #define DATE_LENGTH 7 /*YYMMDD*/ |
39 | 39 | ||
40 | const char *months[12]= | 40 | const char *months[12]= |
41 | { | 41 | { |
42 | "Jan", | 42 | "Jan", |
43 | "Feb", | 43 | "Feb", |
44 | "Mar", | 44 | "Mar", |
45 | "Apr", | 45 | "Apr", |
46 | "May", | 46 | "May", |
47 | "Jun", | 47 | "Jun", |
48 | "Jul", | 48 | "Jul", |
49 | "Aug", | 49 | "Aug", |
50 | "Sep", | 50 | "Sep", |
51 | "Oct", | 51 | "Oct", |
52 | "Nov", | 52 | "Nov", |
53 | "Dec" | 53 | "Dec" |
54 | }; | 54 | }; |
55 | 55 | ||
56 | /*****************************************************************************/ | 56 | /*****************************************************************************/ |
57 | /* Replacement of the strtok function. This one forgets "delim" when it is */ | 57 | /* Replacement of the strtok function. This one forgets "delim" when it is */ |
58 | /* between two commas. */ | 58 | /* between two commas. */ |
59 | /* Thanks to Julio Lucas who has told me the bug and has proposed me a patch */ | 59 | /* Thanks to Julio Lucas who has told me the bug and has proposed me a patch */ |
60 | /*****************************************************************************/ | 60 | /*****************************************************************************/ |
61 | char *csv_strtok(char *s, char *delim) | 61 | char *csv_strtok(char *s, char *delim) |
62 | { | 62 | { |
63 | static char *next=NULL; | 63 | static char *next=NULL; |
64 | char *temp, *first; | 64 | char *temp, *first; |
65 | int comma=0; | 65 | int comma=0; |
66 | 66 | ||
67 | if (s!=NULL) first=s; | 67 | if (s!=NULL) first=s; |
68 | else first=next; | 68 | else first=next; |
69 | 69 | ||
70 | temp=first; | 70 | temp=first; |
71 | if (*temp=='\0') return NULL; | 71 | if (*temp=='\0') return NULL; |
72 | 72 | ||
73 | while (*temp!='\0' && ((*temp!=*delim) || comma)) | 73 | while (*temp!='\0' && ((*temp!=*delim) || comma)) |
74 | { | 74 | { |
75 | if (*temp=='"') comma ^= 1; | 75 | if (*temp=='"') comma ^= 1; |
76 | temp++; | 76 | temp++; |
77 | } | 77 | } |
78 | 78 | ||
79 | if (*temp=='\0') next=temp; | 79 | if (*temp=='\0') next=temp; |
80 | else | 80 | else |
81 | { | 81 | { |
82 | *temp='\0'; | 82 | *temp='\0'; |
83 | next=temp+1; | 83 | next=temp+1; |
84 | } | 84 | } |
85 | 85 | ||
86 | return first; | 86 | return first; |
87 | } | 87 | } |
88 | 88 | ||
89 | /*****************************************************************************/ | 89 | /*****************************************************************************/ |
90 | /* Parses the csv file and return a list of stocks structure. */ | 90 | /* Parses the csv file and return a list of stocks structure. */ |
91 | /* *csv points on the csv file in memory */ | 91 | /* *csv points on the csv file in memory */ |
92 | /* count defines the country, because csv depends on the country */ | 92 | /* count defines the country, because csv depends on the country */ |
93 | /*****************************************************************************/ | 93 | /*****************************************************************************/ |
94 | stock *parse_csv_file(char *csv) | 94 | stock *parse_csv_file(char *csv) |
95 | { | 95 | { |
96 | char *line; | 96 | char *line; |
97 | char *end_line; | 97 | char *end_line; |
98 | 98 | ||
99 | char *ptr; | 99 | char *ptr; |
100 | 100 | ||
101 | char *date; | 101 | char *date; |
102 | char *time; | 102 | char *time; |
103 | char *name; | 103 | char *name; |
104 | char *symbol; | 104 | char *symbol; |
105 | 105 | ||
106 | stock *StockPtr=NULL; | 106 | stock *StockPtr=NULL; |
107 | stock *LastStockPtr=NULL; | 107 | stock *LastStockPtr=NULL; |
108 | 108 | ||
109 | /* Used to return the pointer to the list */ | 109 | /* Used to return the pointer to the list */ |
110 | stock *FirstStockPtr=NULL; | 110 | stock *FirstStockPtr=NULL; |
111 | 111 | ||
112 | /* used to see if symbol is valid */ | 112 | /* used to see if symbol is valid */ |
113 | int valid; | 113 | int valid; |
114 | char *test; | 114 | char *test; |
115 | 115 | ||
116 | line = csv; | 116 | line = csv; |
117 | end_line = csv; | 117 | end_line = csv; |
118 | 118 | ||
119 | while ((end_line = strstr(line, "\n"))) | 119 | while ((end_line = strstr(line, "\n"))) |
120 | { | 120 | { |
121 | *end_line = 0; | 121 | *end_line = 0; |
122 | 122 | ||
123 | /* Check if symbol valid */ | 123 | /* Check if symbol valid */ |
124 | /* if 1 "N/A" then ok because Indices have N/A for volume */ | 124 | /* if 1 "N/A" then ok because Indices have N/A for volume */ |
125 | /* if 4 "N/A" then ok because Mutual funds have */ | 125 | /* if 4 "N/A" then ok because Mutual funds have */ |
126 | /* if 5 "N/A" then ok because currencies have */ | 126 | /* if 5 "N/A" then ok because currencies have */ |
127 | /* So if >5 then stock not valid */ | 127 | /* So if >5 then stock not valid */ |
128 | 128 | ||
129 | test = line; | 129 | test = line; |
130 | valid = 0; | 130 | valid = 0; |
131 | while ( (test = strstr(test, "N/A")) ) | 131 | while ( (test = strstr(test, "N/A")) ) |
132 | { | 132 | { |
133 | valid ++; | 133 | valid ++; |
134 | test = test +3; | 134 | test = test +3; |
135 | } | 135 | } |
136 | 136 | ||
137 | if (valid < 6) | 137 | if (valid < 6) |
138 | { | 138 | { |
139 | /* This Symbol is valid */ | 139 | /* This Symbol is valid */ |
140 | 140 | ||
141 | StockPtr = malloc_stock(); | 141 | StockPtr = malloc_stock(); |
142 | 142 | ||
143 | ptr = csv_strtok(line, ","); | 143 | ptr = csv_strtok(line, ","); |
144 | if (!ptr) return 0; | 144 | if (!ptr) return 0; |
145 | 145 | ||
146 | symbol = (char *)malloc(strlen(ptr)+1); | 146 | symbol = (char *)malloc(strlen(ptr)+1); |
147 | if (symbol==NULL) | 147 | if (symbol==NULL) |
148 | { | 148 | { |
149 | fprintf(stderr,"Memory allocating error (%s line %d)\n" | 149 | fprintf(stderr,"Memory allocating error (%s line %d)\n" |
150 | ,__FILE__, __LINE__); | 150 | ,__FILE__, __LINE__); |
151 | exit(1); | 151 | exit(1); |
152 | } | 152 | } |
153 | strcpy((char *)(symbol), ptr); | 153 | strcpy((char *)(symbol), ptr); |
154 | StockPtr->Symbol = symbol; | 154 | StockPtr->Symbol = symbol; |
155 | 155 | ||
156 | ptr = csv_strtok(NULL, ","); | 156 | ptr = csv_strtok(NULL, ","); |
157 | if (!ptr) return 0; | 157 | if (!ptr) return 0; |
158 | 158 | ||
159 | name = (char *)malloc(strlen(ptr)+1); | 159 | name = (char *)malloc(strlen(ptr)+1); |
160 | if (name==NULL) | 160 | if (name==NULL) |
161 | { | 161 | { |
162 | fprintf(stderr,"Memory allocating error (%s line %d)\n" | 162 | fprintf(stderr,"Memory allocating error (%s line %d)\n" |
163 | ,__FILE__, __LINE__); | 163 | ,__FILE__, __LINE__); |
164 | exit(1); | 164 | exit(1); |
165 | } | 165 | } |
166 | strcpy((char *)(name), ptr); | 166 | strcpy((char *)(name), ptr); |
167 | StockPtr->Name = name; | 167 | StockPtr->Name = name; |
168 | 168 | ||
169 | ptr = csv_strtok(NULL, ","); | 169 | ptr = csv_strtok(NULL, ","); |
170 | if (!ptr) return 0; | 170 | if (!ptr) return 0; |
171 | sscanf(ptr,"%f",&(StockPtr->CurrentPrice)); | 171 | sscanf(ptr,"%f",&(StockPtr->CurrentPrice)); |
172 | 172 | ||
173 | ptr = csv_strtok(NULL, ","); | 173 | ptr = csv_strtok(NULL, ","); |
174 | if (!ptr) return 0; | 174 | if (!ptr) return 0; |
175 | 175 | ||
176 | date = (char *)malloc(strlen(ptr)+1); | 176 | date = (char *)malloc(strlen(ptr)+1); |
177 | if (date==NULL) | 177 | if (date==NULL) |
178 | { | 178 | { |
179 | fprintf(stderr,"Memory allocating error (%s line %d)\n" | 179 | fprintf(stderr,"Memory allocating error (%s line %d)\n" |
180 | ,__FILE__, __LINE__); | 180 | ,__FILE__, __LINE__); |
181 | exit(1); | 181 | exit(1); |
182 | } | 182 | } |
183 | strcpy((char *)(date), ptr); | 183 | strcpy((char *)(date), ptr); |
184 | StockPtr->Date = date; | 184 | StockPtr->Date = date; |
185 | 185 | ||
186 | ptr = csv_strtok(NULL, ","); | 186 | ptr = csv_strtok(NULL, ","); |
187 | if (!ptr) return 0; | 187 | if (!ptr) return 0; |
188 | 188 | ||
189 | time = (char *)malloc(strlen(ptr)+1); | 189 | time = (char *)malloc(strlen(ptr)+1); |
190 | if (time==NULL) | 190 | if (time==NULL) |
191 | { | 191 | { |
192 | fprintf(stderr,"Memory allocating error (%s line %d)\n" | 192 | fprintf(stderr,"Memory allocating error (%s line %d)\n" |
193 | ,__FILE__, __LINE__); | 193 | ,__FILE__, __LINE__); |
194 | exit(1); | 194 | exit(1); |
195 | } | 195 | } |
196 | strcpy((char *)(time), ptr); | 196 | strcpy((char *)(time), ptr); |
197 | StockPtr->Time = time; | 197 | StockPtr->Time = time; |
198 | 198 | ||
199 | ptr = csv_strtok(NULL, ","); | 199 | ptr = csv_strtok(NULL, ","); |
200 | if (!ptr) return 0; | 200 | if (!ptr) return 0; |
201 | sscanf(ptr,"%f",&(StockPtr->Variation)); | 201 | sscanf(ptr,"%f",&(StockPtr->Variation)); |
202 | 202 | ||
203 | StockPtr->Pourcentage = 100 * StockPtr->Variation / | 203 | StockPtr->Pourcentage = 100 * StockPtr->Variation / |
204 | (StockPtr->CurrentPrice - StockPtr->Variation); | 204 | (StockPtr->CurrentPrice - StockPtr->Variation); |
205 | 205 | ||
206 | StockPtr->LastPrice = StockPtr->CurrentPrice - StockPtr->Variation; | 206 | StockPtr->LastPrice = StockPtr->CurrentPrice - StockPtr->Variation; |
207 | 207 | ||
208 | ptr = csv_strtok(NULL, ","); | 208 | ptr = csv_strtok(NULL, ","); |
209 | if (!ptr) return 0; | 209 | if (!ptr) return 0; |
210 | sscanf(ptr,"%f",&(StockPtr->OpenPrice)); | 210 | sscanf(ptr,"%f",&(StockPtr->OpenPrice)); |
211 | 211 | ||
212 | ptr = csv_strtok(NULL, ","); | 212 | ptr = csv_strtok(NULL, ","); |
213 | if (!ptr) return 0; | 213 | if (!ptr) return 0; |
214 | sscanf(ptr,"%f",&(StockPtr->MaxPrice)); | 214 | sscanf(ptr,"%f",&(StockPtr->MaxPrice)); |
215 | 215 | ||
216 | ptr = csv_strtok(NULL, ","); | 216 | ptr = csv_strtok(NULL, ","); |
217 | if (!ptr) return 0; | 217 | if (!ptr) return 0; |
218 | sscanf(ptr,"%f",&(StockPtr->MinPrice)); | 218 | sscanf(ptr,"%f",&(StockPtr->MinPrice)); |
219 | 219 | ||
220 | ptr = csv_strtok(NULL, ","); | 220 | ptr = csv_strtok(NULL, ","); |
221 | if (!ptr) return 0; | 221 | if (!ptr) return 0; |
222 | StockPtr->Volume = atoi(ptr); | 222 | StockPtr->Volume = atoi(ptr); |
223 | 223 | ||
224 | if( !FirstStockPtr ) | 224 | if( !FirstStockPtr ) |
225 | { | 225 | { |
226 | FirstStockPtr = StockPtr; | 226 | FirstStockPtr = StockPtr; |
227 | StockPtr->PreviousStock = 0; | 227 | StockPtr->PreviousStock = 0; |
228 | } | 228 | } |
229 | 229 | ||
230 | StockPtr->NextStock = 0; | 230 | StockPtr->NextStock = 0; |
231 | 231 | ||
232 | if (LastStockPtr) | 232 | if (LastStockPtr) |
233 | { | 233 | { |
234 | LastStockPtr->NextStock = StockPtr; | 234 | LastStockPtr->NextStock = StockPtr; |
235 | StockPtr->PreviousStock = LastStockPtr; | 235 | StockPtr->PreviousStock = LastStockPtr; |
236 | } | 236 | } |
237 | 237 | ||
238 | LastStockPtr = StockPtr; | 238 | LastStockPtr = StockPtr; |
239 | 239 | ||
240 | } | 240 | } |
241 | else | 241 | else |
242 | { | 242 | { |
243 | /* this symbol is not valid */ | 243 | /* this symbol is not valid */ |
244 | /* Set the stock struct just with Symbol, all other are NULL */ | 244 | /* Set the stock struct just with Symbol, all other are NULL */ |
245 | /* This can be used to see if the symbol has been reached are not */ | 245 | /* This can be used to see if the symbol has been reached are not */ |
246 | 246 | ||
247 | StockPtr = malloc_stock(); | 247 | StockPtr = malloc_stock(); |
248 | 248 | ||
249 | ptr = csv_strtok(line, ","); | 249 | ptr = csv_strtok(line, ","); |
250 | if (!ptr) return 0; | 250 | if (!ptr) return 0; |
251 | 251 | ||
252 | symbol = (char *)malloc(strlen(ptr)+1); | 252 | symbol = (char *)malloc(strlen(ptr)+1); |
253 | if (symbol==NULL) | 253 | if (symbol==NULL) |
254 | { | 254 | { |
255 | fprintf(stderr,"Memory allocating error (%s line %d)\n" | 255 | fprintf(stderr,"Memory allocating error (%s line %d)\n" |
256 | ,__FILE__, __LINE__); | 256 | ,__FILE__, __LINE__); |
257 | exit(1); | 257 | exit(1); |
258 | } | 258 | } |
259 | strcpy((char *)(symbol), ptr); | 259 | strcpy((char *)(symbol), ptr); |
260 | StockPtr->Symbol = symbol; | 260 | StockPtr->Symbol = symbol; |
261 | 261 | ||
262 | if( !FirstStockPtr ) | 262 | if( !FirstStockPtr ) |
263 | { | 263 | { |
264 | FirstStockPtr = StockPtr; | 264 | FirstStockPtr = StockPtr; |
265 | StockPtr->PreviousStock = 0; | 265 | StockPtr->PreviousStock = 0; |
266 | } | 266 | } |
267 | 267 | ||
268 | StockPtr->NextStock = 0; | 268 | StockPtr->NextStock = 0; |
269 | 269 | ||
270 | if (LastStockPtr) | 270 | if (LastStockPtr) |
271 | { | 271 | { |
272 | LastStockPtr->NextStock = StockPtr; | 272 | LastStockPtr->NextStock = StockPtr; |
273 | StockPtr->PreviousStock = LastStockPtr; | 273 | StockPtr->PreviousStock = LastStockPtr; |
274 | } | 274 | } |
275 | 275 | ||
276 | LastStockPtr = StockPtr; | 276 | LastStockPtr = StockPtr; |
277 | } | 277 | } |
278 | 278 | ||
279 | end_line++; | 279 | end_line++; |
280 | line = end_line; | 280 | line = end_line; |
281 | 281 | ||
282 | } | 282 | } |
283 | 283 | ||
284 | return (FirstStockPtr); | 284 | return (FirstStockPtr); |
285 | } | 285 | } |
286 | 286 | ||
287 | /*****************************************************************************/ | 287 | /*****************************************************************************/ |
288 | /* Parses the history quotes file and return a stock structure list. */ | 288 | /* Parses the history quotes file and return a stock structure list. */ |
289 | /*****************************************************************************/ | 289 | /*****************************************************************************/ |
290 | stock *parse_csv_history_file(char *csv_file) | 290 | stock *parse_csv_history_file(char *csv_file) |
291 | { | 291 | { |
292 | 292 | ||
293 | char *line; | 293 | char *line; |
294 | char *end_line; | 294 | char *end_line; |
295 | char *ptr; | 295 | char *ptr; |
296 | 296 | ||
297 | int day; | 297 | int day; |
298 | char smonth[10]; | 298 | char smonth[10]; |
299 | int month; | 299 | int month; |
300 | int year; | 300 | int year; |
301 | 301 | ||
302 | char *date; | 302 | char *date; |
303 | 303 | ||
304 | int i; | 304 | int i; |
305 | int test; | 305 | int test; |
306 | 306 | ||
307 | stock *StockPtr=NULL; | 307 | stock *StockPtr=NULL; |
308 | stock *LastStockPtr=NULL; | 308 | stock *LastStockPtr=NULL; |
309 | 309 | ||
310 | /* Used to return the pointer to the list */ | 310 | /* Used to return the pointer to the list */ |
311 | stock *FirstStockPtr=NULL; | 311 | stock *FirstStockPtr=NULL; |
312 | 312 | ||
313 | line = csv_file; | 313 | line = csv_file; |
314 | end_line = csv_file; | 314 | end_line = csv_file; |
315 | 315 | ||
316 | /* do not use the first line */ | 316 | /* do not use the first line */ |
317 | end_line = strstr(line, "\n"); | 317 | if (!(end_line = strstr(line, "\n"))) |
318 | return 0; | ||
318 | *end_line = 0; | 319 | *end_line = 0; |
319 | end_line++; | 320 | end_line++; |
320 | line = end_line; | 321 | line = end_line; |
321 | 322 | ||
322 | while ((end_line = strstr(line, "\n"))) | 323 | while ((end_line = strstr(line, "\n"))) |
323 | { | 324 | { |
324 | *end_line = 0; | 325 | *end_line = 0; |
325 | 326 | ||
326 | StockPtr = malloc_stock(); | 327 | StockPtr = malloc_stock(); |
327 | 328 | ||
328 | /* Date */ | 329 | /* Date */ |
329 | ptr = strtok(line, ","); | 330 | ptr = strtok(line, ","); |
330 | if (!ptr) return 0; | 331 | if (!ptr) return 0; |
331 | 332 | ||
332 | sscanf(ptr,"%d-%3s-%d",&day,smonth,&year); | 333 | sscanf(ptr,"%d-%3s-%d",&day,smonth,&year); |
333 | 334 | ||
334 | i=0; | 335 | i=0; |
335 | 336 | ||
336 | #ifdef __UNIX__ | 337 | #ifdef __UNIX__ |
337 | while((test=strcasecmp(months[i], smonth))) i++; | 338 | while((test=strcasecmp(months[i], smonth))) i++; |
338 | #elif __WINDOWS__ | 339 | #elif __WINDOWS__ |
339 | while(test=_mbsnbicmp(months[i], smonth, strlen(months[i]))) i++; | 340 | while(test=_mbsnbicmp(months[i], smonth, strlen(months[i]))) i++; |
340 | #endif | 341 | #endif |
341 | 342 | ||
342 | month = i+1; | 343 | month = i+1; |
343 | 344 | ||
344 | date = (char *)malloc(DATE_LENGTH); | 345 | date = (char *)malloc(DATE_LENGTH); |
345 | if (date==NULL) | 346 | if (date==NULL) |
346 | { | 347 | { |
347 | fprintf(stderr,"Memory allocating error (%s line %d)\n" | 348 | fprintf(stderr,"Memory allocating error (%s line %d)\n" |
348 | ,__FILE__, __LINE__); | 349 | ,__FILE__, __LINE__); |
349 | exit(1); | 350 | exit(1); |
350 | } | 351 | } |
351 | sprintf(date,"%.2d%.2d%.2d", year, month, day); | 352 | sprintf(date,"%.2d%.2d%.2d", year, month, day); |
352 | StockPtr->Date = date; | 353 | StockPtr->Date = date; |
353 | 354 | ||
354 | /* Open */ | 355 | /* Open */ |
355 | ptr = strtok(NULL, ","); | 356 | ptr = strtok(NULL, ","); |
356 | if (!ptr) return 0; | 357 | if (!ptr) return 0; |
357 | sscanf(ptr,"%f",&(StockPtr->OpenPrice)); | 358 | sscanf(ptr,"%f",&(StockPtr->OpenPrice)); |
358 | 359 | ||
359 | /* High */ | 360 | /* High */ |
360 | ptr = strtok(NULL, ","); | 361 | ptr = strtok(NULL, ","); |
361 | if (!ptr) return 0; | 362 | if (!ptr) return 0; |
362 | sscanf(ptr,"%f",&(StockPtr->MaxPrice)); | 363 | sscanf(ptr,"%f",&(StockPtr->MaxPrice)); |
363 | 364 | ||
364 | /* Low */ | 365 | /* Low */ |
365 | ptr = strtok(NULL, ","); | 366 | ptr = strtok(NULL, ","); |
366 | if (!ptr) return 0; | 367 | if (!ptr) return 0; |
367 | sscanf(ptr,"%f",&(StockPtr->MinPrice)); | 368 | sscanf(ptr,"%f",&(StockPtr->MinPrice)); |
368 | 369 | ||
369 | /* Close */ | 370 | /* Close */ |
370 | ptr = strtok(NULL, ","); | 371 | ptr = strtok(NULL, ","); |
371 | if (!ptr) return 0; | 372 | if (!ptr) return 0; |
372 | sscanf(ptr,"%f",&(StockPtr->LastPrice)); | 373 | sscanf(ptr,"%f",&(StockPtr->LastPrice)); |
373 | 374 | ||
374 | /* Volume */ | 375 | /* Volume */ |
375 | 376 | ||
376 | ptr = strtok(NULL, ","); | 377 | ptr = strtok(NULL, ","); |
377 | if (!ptr) | 378 | if (!ptr) |
378 | /* It seems to be an indice */ | 379 | /* It seems to be an indice */ |
379 | /* No volume for indices */ | 380 | /* No volume for indices */ |
380 | StockPtr->Volume = 0; | 381 | StockPtr->Volume = 0; |
381 | else | 382 | else |
382 | StockPtr->Volume = atoi(ptr); | 383 | StockPtr->Volume = atoi(ptr); |
383 | 384 | ||
384 | if( !FirstStockPtr ) | 385 | if( !FirstStockPtr ) |
385 | { | 386 | { |
386 | FirstStockPtr = StockPtr; | 387 | FirstStockPtr = StockPtr; |
387 | StockPtr->PreviousStock = 0; | 388 | StockPtr->PreviousStock = 0; |
388 | } | 389 | } |
389 | 390 | ||
390 | StockPtr->NextStock = 0; | 391 | StockPtr->NextStock = 0; |
391 | 392 | ||
392 | if (LastStockPtr) | 393 | if (LastStockPtr) |
393 | { | 394 | { |
394 | LastStockPtr->NextStock = StockPtr; | 395 | LastStockPtr->NextStock = StockPtr; |
395 | StockPtr->PreviousStock = LastStockPtr; | 396 | StockPtr->PreviousStock = LastStockPtr; |
396 | } | 397 | } |
397 | 398 | ||
398 | LastStockPtr = StockPtr; | 399 | LastStockPtr = StockPtr; |
399 | 400 | ||
400 | end_line++; | 401 | end_line++; |
401 | line = end_line; | 402 | line = end_line; |
402 | } | 403 | } |
403 | 404 | ||
404 | return (FirstStockPtr); | 405 | return (FirstStockPtr); |
405 | } | 406 | } |