summaryrefslogtreecommitdiff
authorerik <erik>2007-01-22 23:01:41 (UTC)
committer erik <erik>2007-01-22 23:01:41 (UTC)
commitadcf6075db477909dd8170a74862a6ef91a5127f (patch) (unidiff)
treeda0a1e35c5d392271bce29e84d3af5c30a864f56
parent9b4871054d01a47b4c546952a0948553413840d6 (diff)
downloadopie-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.
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/games/minesweep/minefield.cpp4
-rw-r--r--noncore/net/opieirc/ircsession.cpp8
-rw-r--r--noncore/todayplugins/stockticker/libstocks/csv.c3
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
29static const char *pix_flag[]={ 29static 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
48static const char *pix_mine[]={ 48static 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
68static const int maxGrid = 28; 68static const int maxGrid = 28;
69static const int minGrid = 12; 69static const int minGrid = 12;
70 70
71 71
72 72
73class Mine : public Qt 73class Mine : public Qt
74{ 74{
75public: 75public:
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
104private: 104private:
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
117QPixmap* Mine::knownField = 0; 117QPixmap* Mine::knownField = 0;
118QPixmap* Mine::unknownField = 0; 118QPixmap* Mine::unknownField = 0;
119QPixmap* Mine::flag_pix = 0; 119QPixmap* Mine::flag_pix = 0;
120QPixmap* Mine::mine_pix = 0; 120QPixmap* Mine::mine_pix = 0;
121 121
122Mine::Mine( MineField *f ) 122Mine::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
130void Mine::activate( bool sure ) 130void 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
158void Mine::setState( MineState s ) 158void Mine::setState( MineState s )
159{ 159{
160 st = s; 160 st = s;
161} 161}
162 162
163void Mine::setHint( int h ) 163void Mine::setHint( int h )
164{ 164{
165 hint = h; 165 hint = h;
166} 166}
167 167
168void Mine::paletteChange() 168void 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
180void Mine::paint( QPainter* p, const QColorGroup &cg, const QRect& cr ) 180void 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
288MineField::MineField( QWidget* parent, const char* name ) 288MineField::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
313MineField::~MineField() 313MineField::~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
320void MineField::setState( State st ) 320void MineField::setState( State st )
321{ 321{
322 stat = st; 322 stat = st;
323} 323}
324 324
325void MineField::setup( int level ) 325void 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
371void MineField::drawContents( QPainter * p, int clipx, int clipy, int clipw, int cliph ) 371void 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
393void MineField::setAvailableRect( const QRect &r ) 393void 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
409int MineField::findCellSize() 409int 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
421void MineField::setCellSize( int cellsize ) 421void 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
449void MineField::placeMines() 449void 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
466void MineField::updateCell( int r, int c ) 466void 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
472void MineField::contentsMousePressEvent( QMouseEvent* e ) 472void 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
482void MineField::contentsMouseReleaseEvent( QMouseEvent* e ) 482void 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*/
502void MineField::cellPressed( int row, int col ) 502void 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
512void MineField::held() 512void 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
522void MineField::keyPressEvent( QKeyEvent* e ) 522void 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
531void MineField::keyReleaseEvent( QKeyEvent* ) 531void MineField::keyReleaseEvent( QKeyEvent* )
532{ 532{
533 flagAction = NoAction; 533 flagAction = NoAction;
534} 534}
535 535
536int MineField::getHint( int row, int col ) 536int 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
549void MineField::setHint( int row, int col ) 549void 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
579void MineField::cellClicked( int row, int col ) 579void 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
602void MineField::updateMine( int row, int col ) 602void 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
649void MineField::showMines() 649void 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
665void MineField::paletteChange( const QPalette &o ) 665void 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
671void MineField::writeConfig(Config& cfg) const 671void 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
688void MineField::readConfig(Config& cfg) 688void 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
740QSize MineField::sizeHint() const 742QSize 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
7IRCSession::IRCSession(QObject *parent, IRCServer *server) 7IRCSession::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
18IRCSession::~IRCSession() { 18IRCSession::~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
27void IRCSession::beginSession() { 27void IRCSession::beginSession() {
28 m_connection->doConnect(); 28 m_connection->doConnect();
29} 29}
30 30
31void IRCSession::join(QString channelname) { 31void IRCSession::join(QString channelname) {
32 m_connection->sendLine("JOIN " + channelname); 32 m_connection->sendLine("JOIN " + channelname);
33} 33}
34 34
35void IRCSession::quit(){ 35void 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
39void IRCSession::quit(QString message){ 39void IRCSession::quit(QString message){
40 m_connection->sendLine("QUIT :" + message); 40 m_connection->sendLine("QUIT :" + message);
41} 41}
42 42
43void IRCSession::topic(IRCChannel *channel, QString message){ 43void 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
47void IRCSession::mode(IRCChannel *channel, QString message){ 47void 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
51void IRCSession::mode(IRCPerson *person, QString message){ 51void 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
55void IRCSession::mode(QString message){ 55void IRCSession::mode(QString message){
56 m_connection->sendLine("MODE " + message); 56 m_connection->sendLine("MODE " + message);
57} 57}
58 58
59void IRCSession::raw(QString message){ 59void IRCSession::raw(QString message){
60 m_connection->sendLine(message); 60 m_connection->sendLine(message);
61} 61}
62 62
63void IRCSession::kick(IRCChannel *channel, IRCPerson *person) { 63void 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
67void IRCSession::op(IRCChannel *channel, IRCPerson *person) { 67void 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
71void IRCSession::kick(IRCChannel *channel, IRCPerson *person, QString message) { 71void 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
75void IRCSession::sendMessage(IRCPerson *person, QString message) { 75void 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
79void IRCSession::sendMessage(IRCChannel *channel, QString message) { 79void 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
83void IRCSession::sendAction(IRCChannel *channel, QString message) { 83void 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
87void IRCSession::sendAction(IRCPerson *person, QString message) { 87void 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
91bool IRCSession::isSessionActive() { 91bool IRCSession::isSessionActive() {
92 return m_connection->isConnected(); 92 return m_connection->isConnected();
93} 93}
94 94
95bool IRCSession::isLoggedIn() { 95bool IRCSession::isLoggedIn() {
96 return m_connection->isLoggedIn(); 96 return m_connection->isLoggedIn();
97} 97}
98 98
99void IRCSession::endSession() { 99void 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
106void IRCSession::part(IRCChannel *channel) { 106void 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
110void IRCSession::setValidUsermodes(const QString &modes) { 110void IRCSession::setValidUsermodes(const QString &modes) {
111 m_validUsermodes = modes; 111 m_validUsermodes = modes;
112} 112}
113 113
114void IRCSession::setValidChannelmodes(const QString &modes) { 114void IRCSession::setValidChannelmodes(const QString &modes) {
115 m_validChannelmodes = modes; 115 m_validChannelmodes = modes;
116} 116}
117 117
118void IRCSession::updateNickname(const QString &oldNickname, const QString &newNickname) { 118void 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
153IRCChannel *IRCSession::getChannel(QString channelname) { 155IRCChannel *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
163IRCPerson *IRCSession::getPerson(QString nickname) { 165IRCPerson *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
173void IRCSession::getChannelsByPerson(IRCPerson *person, QList<IRCChannel> &channels) { 175void 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
182void IRCSession::addPerson(IRCPerson *person) { 184void IRCSession::addPerson(IRCPerson *person) {
183 m_people.append(person); 185 m_people.append(person);
184} 186}
185 187
186void IRCSession::addChannel(IRCChannel *channel) { 188void IRCSession::addChannel(IRCChannel *channel) {
187 m_channels.append(channel); 189 m_channels.append(channel);
188} 190}
189 191
190void IRCSession::removeChannel(IRCChannel *channel) { 192void IRCSession::removeChannel(IRCChannel *channel) {
191 m_channels.remove(channel); 193 m_channels.remove(channel);
192} 194}
193 195
194void IRCSession::removePerson(IRCPerson *person) { 196void IRCSession::removePerson(IRCPerson *person) {
195 m_people.remove(person); 197 m_people.remove(person);
196} 198}
197 199
198void IRCSession::handleMessage(IRCMessage *message) { 200void IRCSession::handleMessage(IRCMessage *message) {
199 m_parser->parse(message); 201 m_parser->parse(message);
200} 202}
201 203
202void IRCSession::whois(const QString &nickname) { 204void IRCSession::whois(const QString &nickname) {
203 m_connection->whois(nickname); 205 m_connection->whois(nickname);
204} 206}
205 207
206void IRCSession::sendCTCPPing(const QString &nickname) { 208void IRCSession::sendCTCPPing(const QString &nickname) {
207 m_connection->sendCTCPPing(nickname); 209 m_connection->sendCTCPPing(nickname);
208} 210}
209 211
210void IRCSession::sendCTCPRequest(const QString &nickname, const QString &type, const QString &args) { 212void 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
214void IRCSession::sendCTCPReply(const QString &nickname, const QString &type, const QString &args) { 216void 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
40const char *months[12]= 40const 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/*****************************************************************************/
61char *csv_strtok(char *s, char *delim) 61char *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/*****************************************************************************/
94stock *parse_csv_file(char *csv) 94stock *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/*****************************************************************************/
290stock *parse_csv_history_file(char *csv_file) 290stock *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}