source: titan/plugins/weather/weather.h @ 43344

Last change on this file since 43344 was 31684, checked in by karlo, 5 years ago

fix weather

File size: 17.5 KB
Line 
1#ifndef WEATHER_H
2#define WEATHER_H
3
4struct weather
5{
6        char* city;
7        char* date;
8        char* day0;
9        char* day0_low;
10        char* day0_high;
11        char* day0_condition;
12        char* day0_icon;
13        char* day0_temp;
14        char* day0_humidity;
15        char* day0_wind;
16        char* day1;
17        char* day1_low;
18        char* day1_high;
19        char* day1_condition;
20        char* day1_icon;
21        char* day2;
22        char* day2_low;
23        char* day2_high;
24        char* day2_condition;
25        char* day2_icon;
26        char* day3;
27        char* day3_low;
28        char* day3_high;
29        char* day3_condition;
30        char* day3_icon;
31};
32
33int writeweather(const char *filename, struct skin* listbox);
34
35char* readweather(const char* filename, struct skin* weather, struct skin* listbox)
36{
37        debug(1000, "in");
38        FILE *fd = NULL;
39        char *fileline = NULL;
40        char *location = NULL;
41        struct skin* tmp = NULL;
42        int len = 0;
43
44        if(weather == NULL || listbox == NULL) return NULL;
45
46        fileline = malloc(MINMALLOC);
47        if(fileline == NULL)
48        {
49                err("no memory");
50                return NULL;
51        }
52
53        fd = fopen(filename, "r");
54        if(fd == NULL)
55        {
56                perr("can't open %s", filename);
57                free(fileline);
58                return NULL;
59        }
60
61        while(fgets(fileline, MINMALLOC, fd) != NULL)
62        {
63                if(fileline[0] == '#' || fileline[0] == '\n')
64                        continue;
65                len = strlen(fileline) - 1;
66                if(len >= 0 && fileline[len] == '\n')
67                        fileline[len] = '\0';
68                len--;
69                if(len >= 0 && fileline[len] == '\r')
70                        fileline[len] = '\0';
71
72                tmp = addlistbox(weather, listbox, tmp, 1);
73                if(tmp != NULL)
74                {
75                        changetext(tmp, fileline);
76                        changename(tmp, fileline);
77                        if(location == NULL)
78                        {
79                                location = ostrcat(location, fileline, 1, 0);
80                                location = ostrshrink(location);
81                        }
82                }
83
84        }
85
86        free(fileline);
87        fclose(fd);
88        return location;
89}
90
91void freeweather(struct weather* node)
92{
93        if(node == NULL) return;
94
95        free(node->city); node->city = NULL;
96        free(node->date); node->date = NULL;
97
98        free(node->day0); node->day0 = NULL;
99        free(node->day0_low); node->day0_low = NULL;
100        free(node->day0_high); node->day0_high = NULL;
101        free(node->day0_condition); node->day0_condition = NULL;
102        free(node->day0_icon); node->day0_icon = NULL;
103        free(node->day0_temp); node->day0_temp = NULL;
104        free(node->day0_humidity); node->day0_humidity = NULL;
105        free(node->day0_wind); node->day0_wind = NULL;
106
107        free(node->day1); node->day1 = NULL;
108        free(node->day1_low); node->day1_low = NULL;
109        free(node->day1_high); node->day1_high = NULL;
110        free(node->day1_condition); node->day1_condition = NULL;
111        free(node->day1_icon); node->day1_icon = NULL;
112
113        free(node->day2); node->day2 = NULL;
114        free(node->day2_low); node->day2_low = NULL;
115        free(node->day2_high); node->day2_high = NULL;
116        free(node->day2_condition); node->day2_condition = NULL;
117        free(node->day2_icon); node->day2_icon = NULL;
118
119        free(node->day3); node->day3 = NULL;
120        free(node->day3_low); node->day3_low = NULL;
121        free(node->day3_high); node->day3_high = NULL;
122        free(node->day3_condition); node->day3_condition = NULL;
123        free(node->day3_icon); node->day3_icon = NULL;
124
125        free(node); node = NULL;
126}
127
128struct weather* getweather(char* location)
129{
130        struct weather* weather = NULL;
131        char* tmpstr = NULL, *tmpstr1 = NULL, *tmpstr2 = NULL;
132        char* tmpsearch = NULL;
133
134        if(location == NULL) return NULL;
135
136        char* lang = NULL;
137        lang = ostrcat(_("en-GB"), NULL, 0, 0);
138
139        tmpsearch = ostrcat("data.aspx?src=vista&weadegreetype=C&culture=", lang, 0, 0);
140        tmpsearch = ostrcat(tmpsearch, "&weasearchstr=", 1, 0);
141        tmpsearch = ostrcat(tmpsearch, location, 1, 0);
142        free(lang), lang = NULL;   
143
144        //tmpsearch = ostrcat("data.aspx?src=vista&weadegreetype=C&culture=de-DE&weasearchstr=", location, 0, 0);
145        //tmpsearch = ostrcat("ig/api?weather=", location, 0, 0);
146        //TODO: implement auto language (from titan.cfg)
147        //tmpsearch = ostrcat(tmpsearch, "&hl=de", 1, 0);
148        //tmpsearch = stringreplacechar(tmpsearch, ' ', '+');
149
150        tmpstr = gethttp("weather.service.msn.com", tmpsearch, 80, NULL, NULL, 5000, NULL, 0);
151        //tmpstr = gethttp("www.google.com", tmpsearch, 80, NULL, NULL, 5000, NULL, 0);
152
153        free(tmpsearch); tmpsearch = NULL;
154
155        if(tmpstr != NULL)
156        {
157                weather = (struct weather*)malloc(sizeof(struct weather));
158                if(weather == NULL)
159                {
160                        err("no mem");
161                        free(tmpstr); tmpstr = NULL;
162                        return NULL;
163                }
164                memset(weather, 0, sizeof(struct weather));
165
166                tmpstr1 = tmpstr;
167                tmpstr2 = tmpstr;
168
169                tmpstr2 = ostrstr(tmpstr1, "<weather weatherlocationcode=");
170                if(tmpstr2 != NULL)
171                {
172                        tmpstr1 = tmpstr2 + 5;
173                        weather->city = getxmlentry(tmpstr2, "weatherlocationname=");
174                }
175
176                tmpstr2 = ostrstr(tmpstr1, "<current_conditions>");
177                tmpstr2 = ostrstr(tmpstr1, "<current ");
178                if(tmpstr2 != NULL)
179                {
180                        tmpstr1 = tmpstr2 + 5;
181                        weather->day0_temp = getxmlentry(tmpstr2, "temperature=");
182                        weather->date = getxmlentry(tmpstr2, "date=");
183                        weather->day0_humidity = getxmlentry(tmpstr2, "humidity=");
184                        weather->day0_wind = getxmlentry(tmpstr2, "windspeed=");
185                }
186
187                tmpstr2 = ostrstr(tmpstr1, "<forecast ");
188                if(tmpstr2 != NULL)
189                {
190                        tmpstr1 = tmpstr2 + 5;
191                        weather->day0_low = getxmlentry(tmpstr2, "low=");
192                        weather->day0_high = getxmlentry(tmpstr2, "high=");
193                        weather->day0_icon = getxmlentry(tmpstr2, "skycodeday=");
194                        weather->day0_condition = getxmlentry(tmpstr2, "skytextday=");
195                        weather->day0 = getxmlentry(tmpstr2, " shortday=");
196                }
197
198                tmpstr2 = ostrstr(tmpstr1, "<forecast ");
199                if(tmpstr2 != NULL)
200                {
201                        tmpstr1 = tmpstr2 + 5;
202                        weather->day1_low = getxmlentry(tmpstr2, "low=");
203                        weather->day1_high = getxmlentry(tmpstr2, "high=");
204                        weather->day1_icon = getxmlentry(tmpstr2, "skycodeday=");
205                        weather->day1_condition = getxmlentry(tmpstr2, "skytextday=");
206                        weather->day1 = getxmlentry(tmpstr2, " shortday=");
207                }
208
209                tmpstr2 = ostrstr(tmpstr1, "<forecast ");
210                if(tmpstr2 != NULL)
211                {
212                        tmpstr1 = tmpstr2 + 5;
213                        weather->day2_low = getxmlentry(tmpstr2, "low=");
214                        weather->day2_high = getxmlentry(tmpstr2, "high=");
215                        weather->day2_icon = getxmlentry(tmpstr2, "skycodeday=");
216                        weather->day2_condition = getxmlentry(tmpstr2, "skytextday=");
217                        weather->day2 = getxmlentry(tmpstr2, " shortday=");
218                }
219
220                tmpstr2 = ostrstr(tmpstr1, "<forecast ");
221                if(tmpstr2 != NULL)
222                {
223                        tmpstr1 = tmpstr2 + 5;
224                        weather->day3_low = getxmlentry(tmpstr2, "low=");
225                        weather->day3_high = getxmlentry(tmpstr2, "high=");
226                        weather->day3_icon = getxmlentry(tmpstr2, "skycodeday=");
227                        weather->day3_condition = getxmlentry(tmpstr2, "skytextday=");
228                        weather->day3 = getxmlentry(tmpstr2, " shortday=");
229                }
230
231                free(tmpstr); tmpstr = NULL;
232        }
233
234        return weather;
235}
236
237void changeweatherpic(struct skin* node, char* icon)
238{
239
240                /*
241                0 => 'thunderstorm',
242                1 => 'thunderstorm',
243                2 => 'thunderstorm',
244                3 => 'thunderstorm',
245                4 => 'thunderstorm',
246                5 => 'rain_snow',
247                6 => 'sleet',
248                7 => 'rain_snow',
249                8 => 'icy',
250                9 => 'icy',
251                10 => 'rain_snow',
252                11 => 'showers',
253                12 => 'rain',
254                13 => 'flurries',
255                14 => 'snow',
256                15 => 'snow',
257                16 => 'snow',
258                17 => 'thunderstorm',
259                18 => 'showers',
260                19 => 'dust',
261                20 => 'fog',
262                21 => 'haze',
263                22 => 'haze',
264                23 => 'windy',
265                24 => 'windy',
266                25 => 'icy',
267                26 => 'cloudy',
268                27 => 'mostly_cloudy',
269                28 => 'mostly_cloudy',
270                29 => 'partly_cloudy',
271                30 => 'partly_cloudy',
272                31 => 'sunny',
273                32 => 'sunny',
274                33 => 'mostly_sunny',
275                34 => 'mostly_sunny',
276                35 => 'thunderstorm',
277                36 => 'hot',
278                37 => 'chance_of_tstorm',
279                38 => 'chance_of_tstorm',
280                39 => 'chance_of_rain',
281                40 => 'showers',
282                41 - 'chance_of_snow',
283                42 => 'snow',
284                43 => 'snow',
285                44 => 'na',
286                45 => 'chance_of_rain',
287                46 => 'chance_of_snow',
288                47 => 'chance_of_tstorm');
289                */
290
291        if(icon == NULL)
292                return;
293
294        else if(ostrstr(icon, "10") != NULL)
295                changepic(node, "%pluginpath%/weather/skin/chance_of_snow.png");
296        else if(ostrstr(icon, "11") != NULL)
297                changepic(node, "%pluginpath%/weather/skin/showers.png");
298        else if(ostrstr(icon, "12") != NULL)
299                changepic(node, "%pluginpath%/weather/skin/rain.png");
300        else if(ostrstr(icon, "13") != NULL)
301                changepic(node, "%pluginpath%/weather/skin/flurries.png");
302        else if(ostrstr(icon, "14") != NULL)
303                changepic(node, "%pluginpath%/weather/skin/snow.png");
304        else if(ostrstr(icon, "15") != NULL)
305                changepic(node, "%pluginpath%/weather/skin/snow.png");
306        else if(ostrstr(icon, "16") != NULL)
307                changepic(node, "%pluginpath%/weather/skin/snow.png");
308        else if(ostrstr(icon, "17") != NULL)
309                changepic(node, "%pluginpath%/weather/skin/rain.png");
310        else if(ostrstr(icon, "18") != NULL)
311                changepic(node, "%pluginpath%/weather/skin/showers.png");
312        else if(ostrstr(icon, "19") != NULL)
313                changepic(node, "%pluginpath%/weather/skin/fog.png");
314        else if(ostrstr(icon, "20") != NULL)
315                changepic(node, "%pluginpath%/weather/skin/fog.png");
316        else if(ostrstr(icon, "21") != NULL)
317                changepic(node, "%pluginpath%/weather/skin/fog.png");
318        else if(ostrstr(icon, "22") != NULL)
319                changepic(node, "%pluginpath%/weather/skin/fog.png");
320        else if(ostrstr(icon, "23") != NULL)
321                changepic(node, "%pluginpath%/weather/skin/chance_of_storm.png");
322        else if(ostrstr(icon, "24") != NULL)
323                changepic(node, "%pluginpath%/weather/skin/chance_of_storm.png");
324        else if(ostrstr(icon, "25") != NULL)
325                changepic(node, "%pluginpath%/weather/skin/icy.png");
326        else if(ostrstr(icon, "26") != NULL)
327                changepic(node, "%pluginpath%/weather/skin/cloudy.png");
328        else if(ostrstr(icon, "27") != NULL)
329                changepic(node, "%pluginpath%/weather/skin/partly_cloudy.png");
330        else if(ostrstr(icon, "28") != NULL)
331                changepic(node, "%pluginpath%/weather/skin/partly_cloudy.png");
332        else if(ostrstr(icon, "29") != NULL)
333                changepic(node, "%pluginpath%/weather/skin/partly_cloudy.png");
334        else if(ostrstr(icon, "30") != NULL)
335                changepic(node, "%pluginpath%/weather/skin/partly_cloudy.png");
336        else if(ostrstr(icon, "31") != NULL)
337                changepic(node, "%pluginpath%/weather/skin/sunny.png");
338        else if(ostrstr(icon, "32") != NULL)
339                changepic(node, "%pluginpath%/weather/skin/sunny.png");
340        else if(ostrstr(icon, "33") != NULL)
341                changepic(node, "%pluginpath%/weather/skin/mostly_sunny.png");
342        else if(ostrstr(icon, "34") != NULL)
343                changepic(node, "%pluginpath%/weather/skin/mostly_sunny.png");
344        else if(ostrstr(icon, "35") != NULL)
345                changepic(node, "%pluginpath%/weather/skin/rain.png");
346        else if(ostrstr(icon, "36") != NULL)
347                changepic(node, "%pluginpath%/weather/skin/sunny.png");
348        else if(ostrstr(icon, "37") != NULL)
349                changepic(node, "%pluginpath%/weather/skin/chance_of_storm.png");
350        else if(ostrstr(icon, "38") != NULL)
351                changepic(node, "%pluginpath%/weather/skin/chance_of_storm.png");
352        else if(ostrstr(icon, "39") != NULL)
353                changepic(node, "%pluginpath%/weather/skin/chance_of_rain.png");
354        else if(ostrstr(icon, "40") != NULL)
355                changepic(node, "%pluginpath%/weather/skin/showers.png");
356        else if(ostrstr(icon, "41") != NULL)
357                changepic(node, "%pluginpath%/weather/skin/chance_of_snow.png");
358        else if(ostrstr(icon, "42") != NULL)
359                changepic(node, "%pluginpath%/weather/skin/snow.png");
360        else if(ostrstr(icon, "43") != NULL)
361                changepic(node, "%pluginpath%/weather/skin/snow.png");
362        else if(ostrstr(icon, "44") != NULL)
363                changepic(node, "%pluginpath%/weather/skin/xxxx.png");
364        else if(ostrstr(icon, "45") != NULL)
365                changepic(node, "%pluginpath%/weather/skin/chance_of_rain.png");
366        else if(ostrstr(icon, "46") != NULL)
367                changepic(node, "%pluginpath%/weather/skin/chance_of_snow.png");
368        else if(ostrstr(icon, "47") != NULL)
369                changepic(node, "%pluginpath%/weather/skin/chance_of_rain.png");
370        else if(ostrstr(icon, "0") != NULL)
371                changepic(node, "%pluginpath%/weather/skin/rain.png");
372        else if(ostrstr(icon, "1") != NULL)
373                changepic(node, "%pluginpath%/weather/skin/rain.png");
374        else if(ostrstr(icon, "2") != NULL)
375                changepic(node, "%pluginpath%/weather/skin/rain.png");
376        else if(ostrstr(icon, "3") != NULL)
377                changepic(node, "%pluginpath%/weather/skin/rain.png");
378        else if(ostrstr(icon, "4") != NULL)
379                changepic(node, "%pluginpath%/weather/skin/rain.png");
380        else if(ostrstr(icon, "5") != NULL)
381                changepic(node, "%pluginpath%/weather/skin/chance_of_snow.png");
382        else if(ostrstr(icon, "6") != NULL)
383                changepic(node, "%pluginpath%/weather/skin/rain.png");
384        else if(ostrstr(icon, "7") != NULL)
385                changepic(node, "%pluginpath%/weather/skin/chance_of_snow.png");
386        else if(ostrstr(icon, "8") != NULL)
387                changepic(node, "%pluginpath%/weather/skin/icy.png");
388        else if(ostrstr(icon, "9") != NULL)
389                changepic(node, "%pluginpath%/weather/skin/icy.png");
390}
391
392void screenweather()
393{
394        int rcret = 0;
395        struct skin* weather = getscreen("weather");
396        struct skin* listbox = getscreennode(weather, "listbox");
397        struct skin* date = getscreennode(weather, "date");
398        struct skin* day0 = getscreennode(weather, "day0");
399        struct skin* day0_low = getscreennode(weather, "day0_low");
400        struct skin* day0_high = getscreennode(weather, "day0_high");
401        struct skin* day0_condition = getscreennode(weather, "day0_condition");
402        struct skin* day0_icon = getscreennode(weather, "day0_icon");
403        struct skin* day1 = getscreennode(weather, "day1");
404        struct skin* day1_low = getscreennode(weather, "day1_low");
405        struct skin* day1_high = getscreennode(weather, "day1_high");
406        struct skin* day1_condition = getscreennode(weather, "day1_condition");
407        struct skin* day1_icon = getscreennode(weather, "day1_icon");
408        struct skin* day2 = getscreennode(weather, "day2");
409        struct skin* day2_low = getscreennode(weather, "day2_low");
410        struct skin* day2_high = getscreennode(weather, "day2_high");
411        struct skin* day2_condition = getscreennode(weather, "day2_condition");
412        struct skin* day2_icon = getscreennode(weather, "day2_icon");
413        struct skin* day3 = getscreennode(weather, "day3");
414        struct skin* day3_low = getscreennode(weather, "day3_low");
415        struct skin* day3_high = getscreennode(weather, "day3_high");
416        struct skin* day3_condition = getscreennode(weather, "day3_condition");
417        struct skin* day3_icon = getscreennode(weather, "day3_icon");
418        struct weather* node = NULL;
419        char* tmpstr = NULL, *location = NULL;
420
421        location = readweather(getconfig("weatherfile", NULL), weather, listbox);
422        addscreenrc(weather, listbox);
423
424start:
425
426        tmpstr = ostrcat(_("Weather"), " - ", 0, 0);
427        tmpstr = ostrcat(tmpstr, location, 1, 0);
428        changetitle(weather, tmpstr);
429        free(tmpstr); tmpstr = NULL;
430
431        node = getweather(location);
432        free(location); location = NULL;
433
434        if(node != NULL)
435        {
436                changetext(date, node->date);
437
438                tmpstr = ostrcat(_("Day: "), node->day0, 0, 0);
439                changetext(day0, tmpstr);
440                free(tmpstr); tmpstr = NULL;
441
442                tmpstr = ostrcat(_("Lowest temp: "), node->day0_low, 0, 0);
443                changetext(day0_low, tmpstr);
444                free(tmpstr); tmpstr = NULL;
445
446                tmpstr = ostrcat(_("Highest temp: "), node->day0_high, 0, 0);
447                changetext(day0_high, tmpstr);
448                free(tmpstr); tmpstr = NULL;
449
450                tmpstr = ostrcat(_("Condition: "), node->day0_condition, 0, 0);
451                changetext(day0_condition, tmpstr);
452                free(tmpstr); tmpstr = NULL;
453
454                changeweatherpic(day0_icon, node->day0_icon);
455
456                tmpstr = ostrcat(_("Day: "), node->day1, 0, 0);
457                changetext(day1, tmpstr);
458                free(tmpstr); tmpstr = NULL;
459
460                tmpstr = ostrcat(_("Lowest temp: "), node->day1_low, 0, 0);
461                changetext(day1_low, tmpstr);
462                free(tmpstr); tmpstr = NULL;
463
464                tmpstr = ostrcat(_("Highest temp: "), node->day1_high, 0, 0);
465                changetext(day1_high, tmpstr);
466                free(tmpstr); tmpstr = NULL;
467
468                tmpstr = ostrcat(_("Condition: "), node->day1_condition, 0, 0);
469                changetext(day1_condition, tmpstr);
470                free(tmpstr); tmpstr = NULL;
471
472                changeweatherpic(day1_icon, node->day1_icon);
473
474                tmpstr = ostrcat(_("Day: "), node->day2, 0, 0);
475                changetext(day2, tmpstr);
476                free(tmpstr); tmpstr = NULL;
477
478                tmpstr = ostrcat(_("Lowest temp: "), node->day2_low, 0, 0);
479                changetext(day2_low, tmpstr);
480                free(tmpstr); tmpstr = NULL;
481
482                tmpstr = ostrcat(_("Highest temp: "), node->day2_high, 0, 0);
483                changetext(day2_high, tmpstr);
484                free(tmpstr); tmpstr = NULL;
485
486                tmpstr = ostrcat(_("Condition: "), node->day2_condition, 0, 0);
487                changetext(day2_condition, tmpstr);
488                free(tmpstr); tmpstr = NULL;
489
490                changeweatherpic(day2_icon, node->day2_icon);
491
492                tmpstr = ostrcat(_("Day: "), node->day3, 0, 0);
493                changetext(day3, tmpstr);
494                free(tmpstr); tmpstr = NULL;
495
496                tmpstr = ostrcat(_("Lowest temp: "), node->day3_low, 0, 0);
497                changetext(day3_low, tmpstr);
498                free(tmpstr); tmpstr = NULL;
499
500                tmpstr = ostrcat(_("Highest temp: "), node->day3_high, 0, 0);
501                changetext(day3_high, tmpstr);
502                free(tmpstr); tmpstr = NULL;
503
504                tmpstr = ostrcat(_("Condition: "), node->day3_condition, 0, 0);
505                changetext(day3_condition, tmpstr);
506                free(tmpstr); tmpstr = NULL;
507
508                changeweatherpic(day3_icon, node->day3_icon);
509        }
510
511        drawscreen(weather, 0, 0);
512
513        while(1)
514        {
515                rcret = waitrc(weather, 0, 0);
516
517                if(rcret == getrcconfigint("rcexit", NULL)) break;
518
519                if(rcret == getrcconfigint("rcred", NULL))
520                {
521                        free(location); location = NULL;
522                        location = textinput(_("Location"), NULL);
523                        if(location != NULL)
524                        {
525                                struct skin* tmp = addlistbox(weather, listbox, NULL, 1);
526                                if(tmp != NULL)
527                                {
528                                        changetext(tmp, location);
529                                        changename(tmp, location);
530                                }
531                        }
532                        drawscreen(weather, 0, 0);
533                        if(location == NULL)
534                                continue;
535                        free(location); location = NULL;
536        }
537
538                if(rcret == getrcconfigint("rcok", NULL))
539                {
540                        writeweather(getconfig("weatherfile", NULL), listbox);
541                        continue;
542                }
543
544                if(listbox->select != NULL && rcret == getrcconfigint("rcgreen", NULL))
545                {
546                        delscreennode(weather, listbox->select->name);
547                        listbox->select = NULL;
548                        drawscreen(weather, 0, 0);
549                }
550
551                if(listbox->select != NULL)
552                {
553                        freeweather(node); node = NULL;
554                        location = ostrcat(location, listbox->select->text, 1, 0);
555                        goto start;
556                }
557        }
558
559        delownerrc(weather);
560        delmarkedscreennodes(weather, 1);
561        freeweather(node); node = NULL;
562        clearscreen(weather);
563}
564
565int writeweather(const char *filename, struct skin* listbox)
566{
567        debug(1000, "in");
568        FILE *fd = NULL;
569        struct skin* node = listbox;
570        int ret = 0;
571
572        fd = fopen(filename, "w");
573        if(fd == NULL)
574        {
575                perr("can't open %s", filename);
576                return 1;
577        }
578
579        while(node != NULL)
580        {
581                if(node->del == 1)
582                {
583                        ret = fprintf(fd, "%s\n", node->text);
584                        if(ret < 0)
585                        {
586                                perr("writting file %s", filename);
587                        }
588                }
589                node = node->next;
590        }
591
592        fclose(fd);
593        debug(1000, "out");
594        return 0;
595}
596
597#endif
Note: See TracBrowser for help on using the repository browser.