summaryrefslogtreecommitdiff
path: root/noncore/todayplugins/stockticker/libstocks
authorllornkcor <llornkcor>2002-10-31 00:09:31 (UTC)
committer llornkcor <llornkcor>2002-10-31 00:09:31 (UTC)
commit5a08fd92ac139820e1a1202d0b4b67190f24ccdb (patch) (side-by-side diff)
treee9c0692cf445a886cd529b60f8e535922a7f5d4d /noncore/todayplugins/stockticker/libstocks
parentad396dd7b58fc772423f95be050f645fc7a6d9b9 (diff)
downloadopie-5a08fd92ac139820e1a1202d0b4b67190f24ccdb.zip
opie-5a08fd92ac139820e1a1202d0b4b67190f24ccdb.tar.gz
opie-5a08fd92ac139820e1a1202d0b4b67190f24ccdb.tar.bz2
added - initial check in
Diffstat (limited to 'noncore/todayplugins/stockticker/libstocks') (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/todayplugins/stockticker/libstocks/.cvsignore3
-rw-r--r--noncore/todayplugins/stockticker/libstocks/csv.c402
-rw-r--r--noncore/todayplugins/stockticker/libstocks/csv.h36
-rw-r--r--noncore/todayplugins/stockticker/libstocks/currency.c66
-rw-r--r--noncore/todayplugins/stockticker/libstocks/history.c149
-rw-r--r--noncore/todayplugins/stockticker/libstocks/http.c300
-rw-r--r--noncore/todayplugins/stockticker/libstocks/http.h35
-rw-r--r--noncore/todayplugins/stockticker/libstocks/lists.c123
-rw-r--r--noncore/todayplugins/stockticker/libstocks/lists.h35
-rw-r--r--noncore/todayplugins/stockticker/libstocks/stocks.c347
-rw-r--r--noncore/todayplugins/stockticker/libstocks/stocks.h116
11 files changed, 1612 insertions, 0 deletions
diff --git a/noncore/todayplugins/stockticker/libstocks/.cvsignore b/noncore/todayplugins/stockticker/libstocks/.cvsignore
new file mode 100644
index 0000000..c9bb88e
--- a/dev/null
+++ b/noncore/todayplugins/stockticker/libstocks/.cvsignore
@@ -0,0 +1,3 @@
+Makefile*
+moc_*
+*.moc \ No newline at end of file
diff --git a/noncore/todayplugins/stockticker/libstocks/csv.c b/noncore/todayplugins/stockticker/libstocks/csv.c
new file mode 100644
index 0000000..99a44e4
--- a/dev/null
+++ b/noncore/todayplugins/stockticker/libstocks/csv.c
@@ -0,0 +1,402 @@
+/* libstocks - Library to get current stock quotes from Yahoo Finance
+ *
+ * Copyright (C) 2000 Eric Laeuffer
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#define __CSV_C__
+
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+#ifdef __WINDOWS__
+#include <mbstring.h>
+#endif
+
+#include "csv.h"
+#include "stocks.h"
+#include "lists.h"
+
+#define DATE_LENGTH 7 /*YYMMDD*/
+
+const char *months[12]=
+{
+ "Jan",
+ "Feb",
+ "Mar",
+ "Apr",
+ "May",
+ "Jun",
+ "Jul",
+ "Aug",
+ "Sep",
+ "Oct",
+ "Nov",
+ "Dec"
+};
+
+/*****************************************************************************/
+/* Replacement of the strtok function. This one forgets "delim" when it is */
+/* between two commas. */
+/* Thanks to Julio Lucas who has told me the bug and has proposed me a patch */
+/*****************************************************************************/
+char *csv_strtok(char *s, char *delim)
+{
+ static char *next=NULL;
+ char *temp, *first;
+ int comma=0;
+
+ if (s!=NULL) first=s;
+ else first=next;
+
+ temp=first;
+ if (*temp=='\0') return NULL;
+
+ while (*temp!='\0' && ((*temp!=*delim) || comma))
+ {
+ if (*temp=='"') comma ^= 1;
+ temp++;
+ }
+
+ if (*temp=='\0') next=temp;
+ else
+ {
+ *temp='\0';
+ next=temp+1;
+ }
+
+ return first;
+}
+
+/*****************************************************************************/
+/* Parses the csv file and return a list of stocks structure. */
+/* *csv points on the csv file in memory */
+/* count defines the country, because csv depends on the country */
+/*****************************************************************************/
+stock *parse_csv_file(char *csv)
+{
+ char *line;
+ char *end_line;
+
+ char *ptr;
+
+ char *date;
+ char *time;
+ char *name;
+ char *symbol;
+
+ stock *StockPtr=NULL;
+ stock *LastStockPtr=NULL;
+
+ /* Used to return the pointer to the list */
+ stock *FirstStockPtr=NULL;
+
+ /* used to see if symbol is valid */
+ int valid;
+ char *test;
+
+ line = csv;
+ end_line = csv;
+
+ while ((end_line = strstr(line, "\n")))
+ {
+ *end_line = 0;
+
+ /* Check if symbol valid */
+ /* if 1 "N/A" then ok because Indices have N/A for volume */
+ /* if 4 "N/A" then ok because Mutual funds have */
+ /* if 5 "N/A" then ok because currencies have */
+ /* So if >5 then stock not valid */
+
+ test = line;
+ valid = 0;
+ while ( (test = strstr(test, "N/A")) )
+ {
+ valid ++;
+ test = test +3;
+ }
+
+ if (valid < 6)
+ {
+ /* This Symbol is valid */
+
+ StockPtr = malloc_stock();
+
+ ptr = csv_strtok(line, ",");
+ if (!ptr) return 0;
+
+ symbol = (char *)malloc(strlen(ptr)+1);
+ if (symbol==NULL)
+ {
+ fprintf(stderr,"Memory allocating error (%s line %d)\n"
+ ,__FILE__, __LINE__);
+ exit(1);
+ }
+ strcpy((char *)(symbol), ptr);
+ StockPtr->Symbol = symbol;
+
+ ptr = csv_strtok(NULL, ",");
+ if (!ptr) return 0;
+
+ name = (char *)malloc(strlen(ptr)+1);
+ if (name==NULL)
+ {
+ fprintf(stderr,"Memory allocating error (%s line %d)\n"
+ ,__FILE__, __LINE__);
+ exit(1);
+ }
+ strcpy((char *)(name), ptr);
+ StockPtr->Name = name;
+
+ ptr = csv_strtok(NULL, ",");
+ if (!ptr) return 0;
+ sscanf(ptr,"%f",&(StockPtr->CurrentPrice));
+
+ ptr = csv_strtok(NULL, ",");
+ if (!ptr) return 0;
+
+ date = (char *)malloc(strlen(ptr)+1);
+ if (date==NULL)
+ {
+ fprintf(stderr,"Memory allocating error (%s line %d)\n"
+ ,__FILE__, __LINE__);
+ exit(1);
+ }
+ strcpy((char *)(date), ptr);
+ StockPtr->Date = date;
+
+ ptr = csv_strtok(NULL, ",");
+ if (!ptr) return 0;
+
+ time = (char *)malloc(strlen(ptr)+1);
+ if (time==NULL)
+ {
+ fprintf(stderr,"Memory allocating error (%s line %d)\n"
+ ,__FILE__, __LINE__);
+ exit(1);
+ }
+ strcpy((char *)(time), ptr);
+ StockPtr->Time = time;
+
+ ptr = csv_strtok(NULL, ",");
+ if (!ptr) return 0;
+ sscanf(ptr,"%f",&(StockPtr->Variation));
+
+ StockPtr->Pourcentage = 100 * StockPtr->Variation /
+ (StockPtr->CurrentPrice - StockPtr->Variation);
+
+ StockPtr->LastPrice = StockPtr->CurrentPrice - StockPtr->Variation;
+
+ ptr = csv_strtok(NULL, ",");
+ if (!ptr) return 0;
+ sscanf(ptr,"%f",&(StockPtr->OpenPrice));
+
+ ptr = csv_strtok(NULL, ",");
+ if (!ptr) return 0;
+ sscanf(ptr,"%f",&(StockPtr->MaxPrice));
+
+ ptr = csv_strtok(NULL, ",");
+ if (!ptr) return 0;
+ sscanf(ptr,"%f",&(StockPtr->MinPrice));
+
+ ptr = csv_strtok(NULL, ",");
+ if (!ptr) return 0;
+ StockPtr->Volume = atoi(ptr);
+
+ if( !FirstStockPtr )
+ {
+ FirstStockPtr = StockPtr;
+ StockPtr->PreviousStock = 0;
+ }
+
+ StockPtr->NextStock = 0;
+
+ if (LastStockPtr)
+ {
+ LastStockPtr->NextStock = StockPtr;
+ StockPtr->PreviousStock = LastStockPtr;
+ }
+
+ LastStockPtr = StockPtr;
+
+ }
+ else
+ {
+ /* this symbol is not valid */
+ /* Set the stock struct just with Symbol, all other are NULL */
+ /* This can be used to see if the symbol has been reached are not */
+
+ StockPtr = malloc_stock();
+
+ ptr = csv_strtok(line, ",");
+ if (!ptr) return 0;
+
+ symbol = (char *)malloc(strlen(ptr)+1);
+ if (symbol==NULL)
+ {
+ fprintf(stderr,"Memory allocating error (%s line %d)\n"
+ ,__FILE__, __LINE__);
+ exit(1);
+ }
+ strcpy((char *)(symbol), ptr);
+ StockPtr->Symbol = symbol;
+
+ if( !FirstStockPtr )
+ {
+ FirstStockPtr = StockPtr;
+ StockPtr->PreviousStock = 0;
+ }
+
+ StockPtr->NextStock = 0;
+
+ if (LastStockPtr)
+ {
+ LastStockPtr->NextStock = StockPtr;
+ StockPtr->PreviousStock = LastStockPtr;
+ }
+
+ LastStockPtr = StockPtr;
+ }
+
+ end_line++;
+ line = end_line;
+
+ }
+
+ return (FirstStockPtr);
+}
+
+/*****************************************************************************/
+/* Parses the history quotes file and return a stock structure list. */
+/*****************************************************************************/
+stock *parse_csv_history_file(char *csv_file)
+{
+
+ char *line;
+ char *end_line;
+ char *ptr;
+
+ int day;
+ char smonth[10];
+ int month;
+ int year;
+
+ char *date;
+
+ int i;
+ int test;
+
+ stock *StockPtr=NULL;
+ stock *LastStockPtr=NULL;
+
+ /* Used to return the pointer to the list */
+ stock *FirstStockPtr=NULL;
+
+ line = csv_file;
+ end_line = csv_file;
+
+ /* do not use the first line */
+ end_line = strstr(line, "\n");
+ *end_line = 0;
+ end_line++;
+ line = end_line;
+
+ while ((end_line = strstr(line, "\n")))
+ {
+ *end_line = 0;
+
+ StockPtr = malloc_stock();
+
+ /* Date */
+ ptr = strtok(line, ",");
+ if (!ptr) return 0;
+
+ sscanf(ptr,"%d-%3s-%d",&day,smonth,&year);
+
+ i=0;
+
+#ifdef __UNIX__
+ while((test=strcasecmp(months[i], smonth))) i++;
+#elif __WINDOWS__
+ while(test=_mbsnbicmp(months[i], smonth, strlen(months[i]))) i++;
+#endif
+
+ month = i+1;
+
+ date = (char *)malloc(DATE_LENGTH);
+ if (date==NULL)
+ {
+ fprintf(stderr,"Memory allocating error (%s line %d)\n"
+ ,__FILE__, __LINE__);
+ exit(1);
+ }
+ sprintf(date,"%.2d%.2d%.2d", year, month, day);
+ StockPtr->Date = date;
+
+ /* Open */
+ ptr = strtok(NULL, ",");
+ if (!ptr) return 0;
+ sscanf(ptr,"%f",&(StockPtr->OpenPrice));
+
+ /* High */
+ ptr = strtok(NULL, ",");
+ if (!ptr) return 0;
+ sscanf(ptr,"%f",&(StockPtr->MaxPrice));
+
+ /* Low */
+ ptr = strtok(NULL, ",");
+ if (!ptr) return 0;
+ sscanf(ptr,"%f",&(StockPtr->MinPrice));
+
+ /* Close */
+ ptr = strtok(NULL, ",");
+ if (!ptr) return 0;
+ sscanf(ptr,"%f",&(StockPtr->LastPrice));
+
+ /* Volume */
+
+ ptr = strtok(NULL, ",");
+ if (!ptr)
+ /* It seems to be an indice */
+ /* No volume for indices */
+ StockPtr->Volume = 0;
+ else
+ StockPtr->Volume = atoi(ptr);
+
+ if( !FirstStockPtr )
+ {
+ FirstStockPtr = StockPtr;
+ StockPtr->PreviousStock = 0;
+ }
+
+ StockPtr->NextStock = 0;
+
+ if (LastStockPtr)
+ {
+ LastStockPtr->NextStock = StockPtr;
+ StockPtr->PreviousStock = LastStockPtr;
+ }
+
+ LastStockPtr = StockPtr;
+
+ end_line++;
+ line = end_line;
+ }
+
+ return (FirstStockPtr);
+}
diff --git a/noncore/todayplugins/stockticker/libstocks/csv.h b/noncore/todayplugins/stockticker/libstocks/csv.h
new file mode 100644
index 0000000..4205c61
--- a/dev/null
+++ b/noncore/todayplugins/stockticker/libstocks/csv.h
@@ -0,0 +1,36 @@
+/* libstocks - Library to get current stock quotes from Yahoo Finance
+ *
+ * Copyright (C) 2000 Eric Laeuffer
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __CSV_H__
+#define __CSV_H__
+
+#ifndef __CSV_C__
+#define PUBEXT_CSV extern
+#else
+#define PUBEXT_CSV
+#endif
+
+#include "stocks.h"
+
+PUBEXT_CSV stock *parse_csv_file(char *);
+PUBEXT_CSV char *csv_strtok(char *, char *);
+PUBEXT_CSV stock *parse_csv_history_file(char *);
+
+#endif /* __CSV_H__ */
diff --git a/noncore/todayplugins/stockticker/libstocks/currency.c b/noncore/todayplugins/stockticker/libstocks/currency.c
new file mode 100644
index 0000000..9a08a9d
--- a/dev/null
+++ b/noncore/todayplugins/stockticker/libstocks/currency.c
@@ -0,0 +1,66 @@
+/* libstocks - Library to get current stock quotes from Yahoo Finance
+ *
+ * Copyright (C) 2000 Eric Laeuffer
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#define __CURRENCY_C__
+
+
+#include <stdio.h>
+#include <string.h>
+#include <malloc.h>
+#include <stdlib.h>
+
+#include "stocks.h"
+
+/*****************************************************************************/
+/* returns the currency exchange rate of "from" currency into */
+/* "into" currency. */
+/*****************************************************************************/
+libstocks_return_code get_currency_exchange(char *from,
+ char *into,
+ float *exchange)
+{
+ char *symbol;
+ stock *data;
+ libstocks_return_code error;
+
+ if((symbol = (char *)malloc(strlen(from)+strlen(into)+3))==NULL)
+ {
+ fprintf(stderr,"Memory allocating error (%s line %d)\n"
+ ,__FILE__, __LINE__);
+ exit(1);
+ }
+
+ strcpy(symbol, from);
+ strcat(symbol, into);
+ strcat(symbol, "=X");
+
+ error = get_stocks(symbol, &data);
+ if (error)
+ {
+ *exchange = 0;
+ return(error);
+ }
+
+ free_stocks(data);
+
+ *exchange = data->CurrentPrice;
+ return(error);
+
+}
diff --git a/noncore/todayplugins/stockticker/libstocks/history.c b/noncore/todayplugins/stockticker/libstocks/history.c
new file mode 100644
index 0000000..61f57d1
--- a/dev/null
+++ b/noncore/todayplugins/stockticker/libstocks/history.c
@@ -0,0 +1,149 @@
+/* libstocks - Library to get current stock quotes from Yahoo Finance
+ *
+ * Copyright (C) 2000 Eric Laeuffer
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#define __HISTORY_C__
+
+#include <string.h>
+#include <stdlib.h>
+
+#ifdef __WINDOWS__
+#include <malloc.h>
+#endif
+
+#include "stocks.h"
+#include "http.h"
+#include "csv.h"
+
+const char history_stocks_server[]="chart.yahoo.com";
+const char url_history_beg[]="/table.csv?s=";
+
+/*****************************************************************************/
+/* Gets the stock history csv file and return in csv_file the result. */
+/* The stock is defined by its symbol. */
+/* The history file starts at date1 and stops at date2. */
+/*****************************************************************************/
+libstocks_return_code get_history_csv(char *symbol,
+ char *date1,
+ char *date2,
+ char **csv_file)
+{
+ char *data;
+ char url[80];
+
+ char adate[12];
+
+ char *y1, *y2;
+ char *m1, *m2;
+ char *d1, *d2;
+
+ libstocks_return_code error;
+
+ char *test;
+
+ strcpy(url, url_history_beg);
+ strcat(url, symbol);
+
+ strcpy(adate, date1);
+
+ y1=strtok(adate, "/");
+ if(!y1) return ERRDATE;
+ m1 = strtok(NULL, "/");
+ if(!m1) return ERRDATE;
+ d1 = strtok(NULL, "/");
+ if(!m1) return ERRDATE;
+
+ strcat(url, "&a=");
+ strcat(url, m1);
+ strcat(url, "&b=");
+ strcat(url, d1);
+ strcat(url, "&c=");
+ strcat(url, y1);
+
+ strcpy(adate, date2);
+
+ y2=strtok(adate, "/");
+ if(!y2) return ERRDATE;
+ m2 = strtok(NULL, "/");
+ if(!m2) return ERRDATE;
+ d2 = strtok(NULL, "/");
+ if(!d2) return ERRDATE;
+
+ strcat(url, "&d=");
+ strcat(url, m2);
+ strcat(url, "&e=");
+ strcat(url, d2);
+ strcat(url, "&f=");
+ strcat(url, y2);
+ strcat(url, "&g=d&q=q&y=0&x=.csv");
+
+ error=http_get(url, (char *)history_stocks_server, &data);
+ if (error) return error;
+
+ /* tests if data is valid */
+
+ /* The server returns "No data available for symbol" */
+ /* when the stock is not available */
+ test = strstr(data, "No data available");
+ if (test)
+ {
+ free(data);
+ return ERRDATA;
+ }
+
+ /* The server return "No Prices in this date range" */
+ /* when dates have not the good range */
+ test = strstr(data, "No Prices in this date range");
+ if (test)
+ {
+ free(data);
+ return ERRRANG;
+ }
+
+ *csv_file = data;
+
+ return(0);
+}
+
+/*****************************************************************************/
+/* Gets the stock history and return a stock structure list. */
+/* The stock is defined by its symbol. */
+/* The history file starts at date1 and stops at date2. */
+/*****************************************************************************/
+libstocks_return_code get_stock_history(char *symbol,
+ char *date1,
+ char *date2,
+ stock **stock_history)
+{
+ libstocks_return_code error;
+ char *csv_file;
+ stock *stock_parsed;
+
+ error = get_history_csv(symbol, date1, date2, &csv_file);
+ if (error) return error;
+
+ stock_parsed = parse_csv_history_file(csv_file);
+
+ free(csv_file);
+
+ if (!stock_parsed) return ERRPCSV;
+ *stock_history = stock_parsed;
+
+ return(0);
+}
diff --git a/noncore/todayplugins/stockticker/libstocks/http.c b/noncore/todayplugins/stockticker/libstocks/http.c
new file mode 100644
index 0000000..462080d
--- a/dev/null
+++ b/noncore/todayplugins/stockticker/libstocks/http.c
@@ -0,0 +1,300 @@
+/* libstocks - Library to get current stock quotes from Yahoo Finance
+ *
+ * Copyright (C) 2000 Eric Laeuffer
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#define __HTTP_C__
+
+#ifdef __UNIX__
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <netdb.h>
+#include <unistd.h>
+#elif __WINDOWS__
+#include <winsock.h>
+#include <mbstring.h>
+#endif
+
+#include <sys/types.h>
+#include <ctype.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+#include "http.h"
+#include "stocks.h"
+
+#define BUF_SIZE 1024
+#define HEADER_MAXBUF 512
+
+/* pointer to proxy server name or NULL */
+char *http_proxy_server=NULL;
+/* proxy server port number or 0 */
+int http_proxy_port=0;
+
+/*****************************************************************************/
+/* Gets the file from http://http_server/http_file */
+/* This function is used to get quotes csv file from yahoo. */
+/* It allocates memory for the file and defines *pdata (the pointer of datas)*/
+/*****************************************************************************/
+libstocks_return_code http_get(char *http_file, char *http_server, char **pdata)
+{
+ struct hostent *host; /* structs needed by socket */
+ struct sockaddr_in server;
+ int s; /* socket descriptor */
+ char header[HEADER_MAXBUF]; /* request header */
+ int hlg; /* header length */
+ char buf[BUF_SIZE+1]; /* tempory buffer from socket read */
+ int r; /* number of bytes read by read function */
+ char *data=NULL; /* http server response */
+ int data_lgr; /* http server response length */
+ char *temp; /* pointer used to split header and csv */
+ int error_code; /* error code returned by http server */
+ char *csv_ptr; /* pointer to the csv content */
+ int header_founded; /* test if header is founded */
+
+#ifdef DEBUG
+ printf("*http_get\n");
+#endif
+
+ /* get host info by name :*/
+ if ((host = gethostbyname( http_proxy_server ? http_proxy_server : http_server)))
+ {
+ memset((char *) &server,0, sizeof(server));
+ memmove((char *) &server.sin_addr, host->h_addr, host->h_length);
+ server.sin_family = host->h_addrtype;
+ server.sin_port = (unsigned short) htons( http_proxy_server ? http_proxy_port : 80 );
+
+ } else
+ {
+
+#ifdef DEBUG
+ printf(" gethostbyname : NOK\n");
+#endif
+ return ERRHOST;
+ }
+
+ /* create socket */
+ if ((s = socket(AF_INET, SOCK_STREAM, 0)) < 0)
+ {
+
+#ifdef DEBUG
+ printf(" create socket : NOK\n");
+#endif
+ return ERRSOCK;
+ }
+
+ setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, 0, 0);
+
+ /* connect to server */
+ if (connect(s, &server, sizeof(server)) < 0)
+ {
+#ifdef DEBUG
+ printf(" connect to server : NOK\n");
+#endif
+
+#ifdef __UNIX__
+ close(s);
+#elif __WINDOWS__
+ closesocket(s);
+#endif
+ return ERRCONN;
+ }
+
+ /* create header */
+ if (http_proxy_server)
+ {
+ sprintf(header,"GET http://%.128s:80%.256s HTTP/1.0\015\012\015\012",
+ http_server, http_file);
+ }
+ else
+ {
+ sprintf(header,"GET %s HTTP/1.0\015\012\015\012",http_file);
+ }
+
+ hlg=strlen(header);
+
+ /* send header */
+#ifdef __UNIX__
+ if (write(s,header,hlg)!=hlg)
+#elif __WINDOWS__
+ if (send(s,header,hlg, 0)!=hlg)
+#endif
+ {
+#ifdef DEBUG
+ printf(" send header : NOK\n");
+#endif
+ return ERRWHEA;
+ }
+
+ data_lgr = 0;
+ r=1;
+ while(r)
+ {
+ /* Clear Buffer */
+ memset(buf,0,BUF_SIZE+1);
+
+#ifdef __UNIX__
+ r=read(s,buf,BUF_SIZE);
+#elif __WINDOWS__
+ r=recv(s,buf,BUF_SIZE,0);
+#endif
+
+ if (r)
+ {
+ if(!data_lgr)
+ {
+ if((data = malloc(r+1))==NULL)
+ {
+ fprintf(stderr,"Memory allocating error (%s line %d)\n"
+ ,__FILE__, __LINE__);
+ exit(1);
+ }
+
+ memcpy(data,buf,r);
+ data_lgr = r;
+ data[r]=0;
+ }
+ else
+ {
+ if((temp = malloc(r+data_lgr+1))==NULL)
+ {
+ fprintf(stderr,"Memory allocating error (%s line %d)\n"
+ ,__FILE__, __LINE__);
+ exit(1);
+ }
+ memcpy(temp, data, data_lgr);
+ memcpy(temp+data_lgr, buf, r);
+ temp[r+data_lgr]=0;
+ data_lgr += r;
+ free(data);
+ data = temp;
+ }
+ }
+ }
+
+ /* close socket */
+#ifdef __UNIX__
+ close(s);
+#elif __WINDOWS__
+ closesocket(s);
+#endif
+
+#ifdef DEBUG
+ printf("%s\n", data);
+#endif
+
+ /* get headers to test status line */
+ /* and to split headers and content */
+
+ temp = data;
+ header_founded = 0;
+ while( !header_founded )
+ {
+ if (*temp==0) return ERRRHEA;
+
+ if( *temp==0x0A )
+ {
+ /* test if it is the header end */
+ temp ++;
+ if (*temp == 0x0D) temp++;
+ if (*temp == 0x0A) header_founded = 1;
+ }
+ else
+ temp++;
+ }
+
+ *temp = 0;
+ temp++;
+
+ sscanf(data,"HTTP/1.%*d %03d",&error_code);
+
+ if (error_code != 200)
+ {
+#ifdef DEBUG
+ printf(" HTTP error code : %d\n", error_code);
+#endif
+ free(data);
+ return ERRPAHD;
+ }
+
+ if ((csv_ptr = malloc(strlen(temp)+1))==NULL)
+ {
+ free(data);
+ fprintf(stderr,"Memory allocating error (%s line %d)\n"
+ ,__FILE__, __LINE__);
+ exit(1);
+ }
+
+ memcpy(csv_ptr, temp, strlen(temp)+1);
+ free(data);
+
+#ifdef DEBUG
+ printf(" CSV\n");
+ printf("%s,\n", csv_ptr);
+#endif
+
+ *pdata = csv_ptr;
+
+ return 0;
+}
+
+/******************************************************************************/
+/* Set the proxy server to use */
+/******************************************************************************/
+libstocks_return_code set_proxy(char *proxy)
+{
+ char *ptr;
+ char c;
+
+#ifdef DEBUG
+ printf("*set_proxy\n");
+#endif
+
+ /* Parse the proxy URL - It must start with http:// */
+#ifdef __UNIX__
+ if (strncasecmp("http://",proxy,7)) return ERRPROX;
+#elif __WINDOWS__
+ if (_mbsnbicmp("http://",proxy,7)) return ERRPROX;
+#endif
+
+ proxy+=7;
+
+ /* find ":" in the proxy url */
+ ptr = proxy;
+ for (c=*ptr; (c && c!=':');) c=*ptr++;
+
+ /* ptr points just after the ":" or at the end of proxy if : not founded */
+ *(ptr-1)=0; /* clear the ":" */
+
+ http_proxy_server=strdup(proxy);
+
+#ifdef DEBUG
+ printf("http_proxy_server : %s\n", http_proxy_server);
+#endif
+
+ /* get the port number of the url */
+ if (sscanf(ptr,"%d",&http_proxy_port)!=1) return ERRPROX;
+
+#ifdef DEBUG
+ printf("http_proxy_port : %d\n", http_proxy_port);
+#endif
+
+ return 0;
+}
diff --git a/noncore/todayplugins/stockticker/libstocks/http.h b/noncore/todayplugins/stockticker/libstocks/http.h
new file mode 100644
index 0000000..33346f3
--- a/dev/null
+++ b/noncore/todayplugins/stockticker/libstocks/http.h
@@ -0,0 +1,35 @@
+/* libstocks - Library to get current stock quotes from Yahoo Finance
+ *
+ * Copyright (C) 2000 Eric Laeuffer
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __HTTP_H__
+#define __HTTP_H__
+
+#ifndef __HTTP_C__
+#define PUBEXT_HTTP extern
+#else
+#define PUBEXT_HTTP
+#endif
+
+#include "stocks.h"
+
+PUBEXT_HTTP libstocks_return_code http_get(char *, char *, char **);
+
+#endif /* __HTTP_H__ */
diff --git a/noncore/todayplugins/stockticker/libstocks/lists.c b/noncore/todayplugins/stockticker/libstocks/lists.c
new file mode 100644
index 0000000..1ed66b3
--- a/dev/null
+++ b/noncore/todayplugins/stockticker/libstocks/lists.c
@@ -0,0 +1,123 @@
+/* libstocks - Library to get current stock quotes from Yahoo Finance
+ *
+ * Copyright (C) 2000 Eric Laeuffer
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#define __LISTS_C__
+
+#include <malloc.h>
+#include <stdio.h>
+#include <string.h>
+
+#ifdef __WINDOWS__
+#include <stdlib.h>
+#endif
+
+#include "stocks.h"
+#include "lists.h"
+
+/******************************************************************************/
+/* Finds a stock in the stocks list and return the stock pointer. */
+/* *stocks points to the stocks list */
+/* *stock_to_find is the stock to find :)) */
+/******************************************************************************/
+stock *find_stock(stock *stocks, char *stock_to_find)
+{
+ char *test=NULL;
+
+ while(stocks != NULL)
+ {
+ test = strstr(stocks->Symbol, stock_to_find);
+ if(test) return(stocks);
+ stocks = stocks->NextStock;
+ }
+
+ return(0);
+}
+
+/******************************************************************************/
+/* Allocate memory for a stock structure and return the pointer of this */
+/* structure. */
+/******************************************************************************/
+stock *malloc_stock(void)
+{
+ stock *stockptr;
+
+ if((stockptr = (stock *)malloc(sizeof(stock)))==NULL)
+ {
+ fprintf(stderr,"Memory allocating error (%s line %d)\n"
+ ,__FILE__, __LINE__);
+ exit(1);
+ }
+
+ stockptr->Symbol=NULL;
+ stockptr->Name=NULL;
+ stockptr->Time=NULL;
+ stockptr->Date=NULL;
+ stockptr->CurrentPrice=0;
+ stockptr->LastPrice=0;
+ stockptr->OpenPrice=0;
+ stockptr->MinPrice=0;
+ stockptr->MaxPrice=0;
+ stockptr->Variation=0;
+ stockptr->Pourcentage=0;
+ stockptr->Volume=0;
+ stockptr->PreviousStock=0;
+ stockptr->NextStock=0;
+
+ return(stockptr);
+}
+
+/******************************************************************************/
+/* Deallocates a stock structure. */
+/* *stocks_to_free is the pointer of the structure to free */
+/******************************************************************************/
+void free_stocks(stock *stock_to_free)
+{
+ stock *next_stock;
+
+ while(stock_to_free)
+ {
+ next_stock = stock_to_free->NextStock;
+ free(stock_to_free->Symbol);
+ free(stock_to_free->Name);
+ free(stock_to_free->Time);
+ free(stock_to_free->Date);
+ free(stock_to_free);
+ stock_to_free = next_stock;
+ }
+}
+
+/******************************************************************************/
+/* Returns the next stock structure from the list. */
+/* *the_stocks points to the list. */
+/******************************************************************************/
+stock *next_stock(stock *the_stock)
+{
+ return((stock *)(the_stock->NextStock));
+}
+
+/******************************************************************************/
+/* Returns the previous stock structure from the list. */
+/* *the_stocks points to the list. */
+/******************************************************************************/
+stock *previous_stock(stock *the_stock)
+{
+ return((stock *)(the_stock->PreviousStock));
+}
+
diff --git a/noncore/todayplugins/stockticker/libstocks/lists.h b/noncore/todayplugins/stockticker/libstocks/lists.h
new file mode 100644
index 0000000..0132317
--- a/dev/null
+++ b/noncore/todayplugins/stockticker/libstocks/lists.h
@@ -0,0 +1,35 @@
+/* libstocks - Library to get current stock quotes from Yahoo Finance
+ *
+ * Copyright (C) 2000 Eric Laeuffer
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __LISTS_H__
+#define __LISTS_H__
+
+#ifndef __LISTS_C__
+#define PUBEXT_LISTS extern
+#else
+#define PUBEXT_LISTS
+#endif
+
+#include "stocks.h"
+
+PUBEXT_LISTS stock *malloc_stock(void);
+
+
+#endif /* __LISTS_H */
diff --git a/noncore/todayplugins/stockticker/libstocks/stocks.c b/noncore/todayplugins/stockticker/libstocks/stocks.c
new file mode 100644
index 0000000..eb04ba9
--- a/dev/null
+++ b/noncore/todayplugins/stockticker/libstocks/stocks.c
@@ -0,0 +1,347 @@
+/* libstocks - Library to get current stock quotes from Yahoo Finance
+ *
+ * Copyright (C) 2000 Eric Laeuffer
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#define __STOCKS_C__
+
+#include <stdio.h>
+#include <string.h>
+#include <malloc.h>
+#include <stdlib.h>
+
+#ifdef __WINDOWS__
+#include <mbstring.h>
+#endif
+
+#include "http.h"
+#include "csv.h"
+
+#include "stocks.h"
+
+/*
+s = symbol
+n = name
+l1 = last trade
+d1 = date
+t1 = time
+c1 = variation
+o = open
+h = higher price
+g = lower price
+v = volume
+*/
+
+const char yahoo_us_stocks_server[]="finance.yahoo.com";
+const char yahoo_eu_stocks_server[]="finance.yahoo.com";
+//const char yahoo_eu_stocks_server[]="fr.finance.yahoo.com";
+
+const char yahoo_url_beg[]="/d/quotes.csv?s=";
+const char yahoo_url_end[]="&f=snl1d1t1c1ohgv&e=.csv";
+
+typedef enum {
+ YAHOO_EUROPE,
+ YAHOO_US
+} yahoo_source;
+
+#define YAHOO_US_EXT_NB 11
+const char *yahoo_us_ext[YAHOO_US_EXT_NB] =
+{
+ ".US", /* United States */
+ ".TO", /* Canada */
+ ".M", /* Canada */
+ ".V", /* Canada */
+ ".AL", /* Canada */
+ ".MX", /* Mexico */
+ ".SA", /* Brasil */
+ ".BA", /* Argentina */
+ ".CR", /* Venezuela */
+ ".SN", /* Chili */
+ ".AX" /* Australia */
+};
+
+/*****************************************************************************/
+/* Finds, according to the symbol extension, the http source of the quotes. */
+/* Actually just finance.yahoo.com and fr.finance.yahoo.com are supported. */
+/* The function returns the country source (US or EUROPE). */
+/*****************************************************************************/
+yahoo_source find_yahoo_source(char *symbol)
+{
+ char *ptr;
+ int i;
+ int test;
+
+ ptr = strrchr(symbol, '.');
+
+ /* If no extension we suppose it is a US stock */
+ if (!ptr) return YAHOO_US;
+
+ /* extension is found */
+
+ /* Test if it is canadian stock */
+ for (i=0; i<YAHOO_US_EXT_NB; i++)
+ {
+
+#ifdef __UNIX__
+ test = strcasecmp(yahoo_us_ext[i], ptr);
+#elif __WINDOWS__
+ test = _mbsnbicmp(yahoo_us_ext[i], ptr, strlen(yahoo_us_ext[i]));
+#endif
+
+ if (!test) return YAHOO_US;
+ }
+
+ /* We suppose now it is a European stock */
+ return YAHOO_EUROPE;
+}
+
+/*****************************************************************************/
+/* Gets quotes csv file, parses the file and create the quotes list */
+/* *stocks points to the stocks to fetch */
+/* *stock_datas points to the beginning of the list */
+/* count allows to connect to all country servers */
+/*****************************************************************************/
+libstocks_return_code download_stocks(char *stocks,
+ stock **stock_datas,
+ yahoo_source source)
+{
+ char *stocks_server=NULL;
+ char *url_beg=NULL;
+ char *url_end=NULL;
+
+ char *url;
+ char *data;
+
+ libstocks_return_code error;
+
+#ifdef DEBUG
+ printf("*download_stocks\n");
+#endif
+
+ switch (source)
+ {
+ case YAHOO_US:
+ stocks_server = (char *)yahoo_us_stocks_server;
+ break;
+
+ case YAHOO_EUROPE:
+ stocks_server = (char *)yahoo_eu_stocks_server;
+ break;
+ default:
+ stocks_server = (char *)yahoo_us_stocks_server;
+ break;
+
+ }
+
+ url_beg = (char *)yahoo_url_beg;
+ url_end = (char *)yahoo_url_end;
+
+ url = (char *)malloc(strlen(url_beg)
+ +strlen(url_end)
+ +strlen(stocks)+1);
+ if (url==NULL)
+ {
+ fprintf(stderr,"Memory allocating error (%s line %d)\n"
+ ,__FILE__, __LINE__);
+ exit(1);
+ }
+
+ strcpy(url, url_beg);
+ strcat(url, stocks);
+ strcat(url, url_end);
+
+ error=http_get(url, stocks_server, &data);
+
+ free(url);
+
+ if (error) return error;
+
+ *stock_datas = parse_csv_file(data);
+
+ free(data);
+
+ if (!(*stock_datas)) return ERRPCSV;
+
+ return 0;
+
+}
+
+/*****************************************************************************/
+/* Gets quotes from yahoo */
+/* Choses to fetch European or US depending on the symbol extension */
+/* and merges the two lists to one */
+/* *stocks points to the stocks to fetch */
+/* *stock_datas points to the beginning of the list */
+/*****************************************************************************/
+libstocks_return_code get_stocks(const char *stocks, stock **stock_datas)
+{
+ char *tok_ptr;
+ char *eu_quotes=NULL;
+ char *eu_quotes_temp=NULL;
+ int lgr_eu_quotes=0;
+
+ char *us_quotes=NULL;
+ char *us_quotes_temp=NULL;
+ int lgr_us_quotes=0;
+
+ char *symbol;
+
+ yahoo_source source;
+
+ int lgr_symbol=0;
+
+ libstocks_return_code error;
+
+ stock *stocks_tmp=NULL;
+ stock *stocks_tmp2=NULL;
+ stock *stocks_getted=NULL;
+ stock *last_stock=NULL;
+
+#ifdef DEBUG
+ printf("*get_stocks\n");
+#endif
+
+ /* to preserve stocks */
+ tok_ptr = malloc(strlen(stocks)+1);
+ if(tok_ptr==NULL)
+ {
+ fprintf(stderr,"Memory allocating error (%s line %d)\n"
+ ,__FILE__, __LINE__);
+ exit(1);
+ }
+ strcpy(tok_ptr, stocks);
+
+ while( (symbol = strtok(tok_ptr, "+"))!=0)
+ {
+ /* clear tok_ptr for next strtok */
+ tok_ptr = NULL;
+
+ /* look for "." in the symbol */
+ source = find_yahoo_source(symbol);
+
+ switch (source)
+ {
+ case YAHOO_US:
+
+ if (us_quotes)
+ {
+ lgr_us_quotes = strlen(us_quotes);
+ lgr_symbol = strlen(symbol);
+
+ us_quotes_temp = malloc(lgr_us_quotes + lgr_symbol +2);
+ if(us_quotes_temp==NULL)
+ {
+ fprintf(stderr,"Memory allocating error (%s line %d)\n"
+ ,__FILE__, __LINE__);
+ exit(1);
+ }
+ strcpy(us_quotes_temp, us_quotes);
+ strcat(us_quotes_temp,"+");
+ strcat(us_quotes_temp,symbol);
+
+ free(us_quotes);
+ us_quotes = us_quotes_temp;
+ }
+ else
+ {
+ us_quotes = malloc(strlen(symbol)+1);
+
+ if(us_quotes==NULL)
+ {
+ fprintf(stderr,"Memory allocating error (%s line %d)\n"
+ ,__FILE__, __LINE__);
+ exit(1);
+ }
+ strcpy(us_quotes, symbol);
+ }
+
+ break;
+
+ case YAHOO_EUROPE:
+
+ if (eu_quotes)
+ {
+ lgr_eu_quotes = strlen(eu_quotes);
+ lgr_symbol = strlen(symbol);
+
+ eu_quotes_temp = malloc(lgr_eu_quotes + lgr_symbol +2);
+ if(eu_quotes_temp==NULL)
+ {
+ fprintf(stderr,"Memory allocating error (%s line %d)\n"
+ ,__FILE__, __LINE__);
+ exit(1);
+ }
+ strcpy(eu_quotes_temp, eu_quotes);
+ strcat(eu_quotes_temp, "+");
+ strcat(eu_quotes_temp, symbol);
+
+ free(eu_quotes);
+ eu_quotes = eu_quotes_temp;
+ }
+ else
+ {
+ eu_quotes = malloc(strlen(symbol)+1);
+ if(eu_quotes==NULL)
+ {
+ fprintf(stderr,"Memory allocating error (%s line %d)\n"
+ ,__FILE__, __LINE__);
+ exit(1);
+ }
+ strcpy(eu_quotes, symbol);
+ }
+ break;
+ }
+ }
+
+ free(tok_ptr);
+
+ if (us_quotes)
+ {
+ /* Gets us quotes */
+ error = download_stocks(us_quotes, &stocks_tmp, YAHOO_US);
+ if (error) return error;
+ }
+
+ if (eu_quotes)
+ {
+ /* Gets european quotes */
+ error = download_stocks(eu_quotes, &stocks_getted, YAHOO_EUROPE);
+ if (error) return error;
+
+ /* concats lists if needed */
+ if (stocks_tmp)
+ {
+ stocks_tmp2 = stocks_tmp;
+
+ while(stocks_tmp2 != NULL)
+ {
+ last_stock = stocks_tmp2;
+ stocks_tmp2 = next_stock(stocks_tmp2);
+ }
+
+ last_stock->NextStock = stocks_getted;
+ stocks_getted->PreviousStock = last_stock;
+
+ }
+ else (stocks_tmp = stocks_getted);
+ }
+
+ *stock_datas = stocks_tmp;
+
+ return(0);
+}
diff --git a/noncore/todayplugins/stockticker/libstocks/stocks.h b/noncore/todayplugins/stockticker/libstocks/stocks.h
new file mode 100644
index 0000000..13250ca
--- a/dev/null
+++ b/noncore/todayplugins/stockticker/libstocks/stocks.h
@@ -0,0 +1,116 @@
+/* libstocks - Library to get current stock quotes from Yahoo Finance
+ *
+ * Copyright (C) 2000 Eric Laeuffer
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __STOCKS_H__
+#define __STOCKS_H__
+
+/* Defines for prototypes */
+#ifndef __LISTS_C__
+#define _LISTS_C_EXT extern
+#else
+#define _LISTS_C_EXT
+#endif /* __LISTS_C__ */
+
+#ifndef __STOCKS_C__
+#define _STOCKS_C_EXT extern
+#else
+#define _STOCKS_C_EXT
+#endif /* __STOCKS_C__ */
+
+#ifndef __HTTP_C__
+#define _HTTP_C_EXT extern
+#else
+#define _HTTP_C_EXT
+#endif /* __HTTP_C__ */
+
+#ifndef __CURRENCY_C__
+#define _CURRENCY_C_EXT extern
+#else
+#define _CURRENCY_C_EXT
+#endif /* __CURRENCY_C__ */
+
+#ifndef __HISTORY_C__
+#define _HISTORY_C_EXT extern
+#else
+#define _HISTORY_C_EXT
+#endif /* __HISTORY_C__ */
+
+typedef struct stockstruct stock;
+
+struct stockstruct {
+ char *Symbol;
+ char *Name;
+ char *Time;
+ char *Date;
+ float CurrentPrice;
+ float LastPrice;
+ float OpenPrice;
+ float MinPrice;
+ float MaxPrice;
+ float Variation;
+ float Pourcentage;
+ int Volume;
+ stock *PreviousStock;
+ stock *NextStock;
+};
+
+/* Errors generates by the library */
+typedef enum {
+ NOERR = 0, /* No error */
+ ERRHOST = 1, /* No such host */
+ ERRSOCK = 2, /* Can't create socket */
+ ERRCONN = 3, /* Can't connect to host */
+ ERRWHEA = 4, /* Write error on socket while writing */
+ ERRRHEA = 5, /* Cannot find header in http response */
+ ERRPAHD = 7, /* Invalid answer from data server */
+ ERRPCSV = 8, /* Error in parsing csv file */
+ ERRPROX = 20, /* Bad proxy url */
+ ERRDATE = 30, /* Bad date format */
+ ERRDATA = 40, /* No data available */
+ ERRRANG = 50 /* No prices for this date range */
+
+} libstocks_return_code;
+
+_LISTS_C_EXT stock *next_stock(stock *);
+_LISTS_C_EXT stock *previous_stock(stock *);
+_LISTS_C_EXT void free_stocks(stock *);
+_LISTS_C_EXT stock *find_stock(stock *stocks, char *);
+
+_STOCKS_C_EXT libstocks_return_code get_stocks(const char *, stock **);
+
+_HTTP_C_EXT libstocks_return_code set_proxy(char *);
+
+
+_CURRENCY_C_EXT libstocks_return_code get_currency_exchange(char *,
+ char *,
+ float *);
+
+_HISTORY_C_EXT libstocks_return_code get_history_csv(char *,
+ char *,
+ char *,
+ char **);
+
+_HISTORY_C_EXT libstocks_return_code get_stock_history(char *,
+ char *,
+ char *,
+ stock **);
+
+
+#endif /* __STOCKS_H__ */