author | llornkcor <llornkcor> | 2002-10-31 00:09:31 (UTC) |
---|---|---|
committer | llornkcor <llornkcor> | 2002-10-31 00:09:31 (UTC) |
commit | 5a08fd92ac139820e1a1202d0b4b67190f24ccdb (patch) (side-by-side diff) | |
tree | e9c0692cf445a886cd529b60f8e535922a7f5d4d /noncore/todayplugins/stockticker/libstocks | |
parent | ad396dd7b58fc772423f95be050f645fc7a6d9b9 (diff) | |
download | opie-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/.cvsignore | 3 | ||||
-rw-r--r-- | noncore/todayplugins/stockticker/libstocks/csv.c | 402 | ||||
-rw-r--r-- | noncore/todayplugins/stockticker/libstocks/csv.h | 36 | ||||
-rw-r--r-- | noncore/todayplugins/stockticker/libstocks/currency.c | 66 | ||||
-rw-r--r-- | noncore/todayplugins/stockticker/libstocks/history.c | 149 | ||||
-rw-r--r-- | noncore/todayplugins/stockticker/libstocks/http.c | 300 | ||||
-rw-r--r-- | noncore/todayplugins/stockticker/libstocks/http.h | 35 | ||||
-rw-r--r-- | noncore/todayplugins/stockticker/libstocks/lists.c | 123 | ||||
-rw-r--r-- | noncore/todayplugins/stockticker/libstocks/lists.h | 35 | ||||
-rw-r--r-- | noncore/todayplugins/stockticker/libstocks/stocks.c | 347 | ||||
-rw-r--r-- | noncore/todayplugins/stockticker/libstocks/stocks.h | 116 |
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__ */ |