X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=sim%2Fucsim%2Fcmd.src%2Fcmdutil.cc;h=955c51e87d155f5ff04ea19ce68a68684420c036;hb=3062f96ccb55d1d05caf9c8782f4961f87b341ce;hp=d27a335fb1f88c05100efafacd338b7ca27f0d67;hpb=95b161f67718bee54c4713e173167a43162a01d9;p=fw%2Fsdcc diff --git a/sim/ucsim/cmd.src/cmdutil.cc b/sim/ucsim/cmd.src/cmdutil.cc index d27a335f..955c51e8 100644 --- a/sim/ucsim/cmd.src/cmdutil.cc +++ b/sim/ucsim/cmd.src/cmdutil.cc @@ -2,7 +2,8 @@ * Simulator of microcontrollers (cmd.src/cmdutil.cc) * * Copyright (C) 1999,99 Drotos Daniel, Talker Bt. - * + * Copyright (C) 2006, Borut Razem - borut.razem@siol.net + * * To contact author send email to drdani@mazsola.iit.uni-miskolc.hu * */ @@ -30,20 +31,29 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA #include #include #include +#include +#include #include +#ifdef SOCKET_AVAIL +# include HEADER_SOCKET +# if defined HAVE_SYS_SOCKET_H +# include +# include +# endif +#endif +#ifdef HAVE_UNISTD_H +#include +#endif #ifdef _WIN32 -# include -# define SOCKET_AVAIL -#elif defined HAVE_SYS_SOCKET_H -# include -# include -# include +#include #endif + #include "i_string.h" #include "stypes.h" #include "globals.h" #include "uccl.h" +#include "cmdutil.h" /* @@ -51,12 +61,59 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA */ #ifdef SOCKET_AVAIL +#ifdef _WIN32 +static void +init_winsock(void) +{ + static bool is_initialized = false; + + if (!is_initialized) + { + WSADATA wsaData; + + // Initialize Winsock + int iResult = WSAStartup(MAKEWORD(2,2), &wsaData); + if (iResult != 0) + { + printf("WSAStartup failed: %d\n", iResult); + exit(1); + } + } +} + +SOCKET +make_server_socket(unsigned short int port) +{ + init_winsock(); + + struct sockaddr_in name; + + /* Create the socket. */ + SOCKET sock = WSASocket(PF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, 0); + if (INVALID_SOCKET == sock) + { + fprintf(stderr, "socket: %d\n", WSAGetLastError()); + return INVALID_SOCKET; + } + + name.sin_family = AF_INET; + name.sin_port = htons(port); + name.sin_addr.s_addr= htonl(INADDR_ANY); + if (SOCKET_ERROR == bind(sock, (struct sockaddr *)&name, sizeof(name))) + { + fprintf(stderr, "bind: %d\n", WSAGetLastError()); + return INVALID_SOCKET; + } + + return sock; +} +#else int make_server_socket(unsigned short int port) { int sock, i; struct sockaddr_in name; - + /* Create the socket. */ sock= socket(PF_INET, SOCK_STREAM, 0); if (sock < 0) @@ -64,7 +121,7 @@ make_server_socket(unsigned short int port) perror("socket"); return(0); } - + /* Give the socket a name. */ i= 1; if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char*)&i, sizeof(i)) < 0) @@ -83,25 +140,154 @@ make_server_socket(unsigned short int port) return(sock); } #endif +#endif +#if _WIN32 +enum e_handle_type +get_handle_type(HANDLE handle) +{ + DWORD file_type = GetFileType(handle); -/* - * Printing out an integer in binary format - */ + switch (file_type) + { + case FILE_TYPE_CHAR: + { + DWORD err; + + if (!ClearCommError(handle, &err, NULL)) + { + switch (GetLastError()) + { + case ERROR_INVALID_HANDLE: + return CH_CONSOLE; + + case ERROR_INVALID_FUNCTION: + /* + * In case of NUL device return type CH_FILE. + * Is this the correct way to test it? + */ + return CH_FILE; + + default: + assert(false); + } + } + } + return CH_SERIAL; + + case FILE_TYPE_DISK: + return CH_FILE; + } + + char sockbuf[256]; + int optlen = sizeof(sockbuf); + + if (SOCKET_ERROR != getsockopt((SOCKET)handle, SOL_SOCKET, SO_TYPE, sockbuf, &optlen) || + WSAENOTSOCK != WSAGetLastError()) + return CH_SOCKET; + + assert(false); + return CH_UNDEF; +} -/*void -print_bin(long data, int bits, class cl_console *con) +bool +input_avail(HANDLE handle, e_handle_type type) { - long mask= 1; + if (CH_UNDEF == type) + type = get_handle_type(handle); - mask= mask << ((bits >= 1)?(bits-1):0); - while (bits--) + switch (type) { - con->printf("%c", (data&mask)?'1':'0'); - mask>>= 1; + case CH_SOCKET: + { + struct timeval tv = {0, 0}; + + assert(INVALID_HANDLE_VALUE != handle); + + fd_set s; + FD_ZERO(&s); + FD_SET((SOCKET)handle, &s); + + int ret = select(0, &s, NULL, NULL, &tv); + if (SOCKET_ERROR == ret) + fprintf(stderr, "Can't select: %d\n", WSAGetLastError()); + + return ret != SOCKET_ERROR && ret != 0; + } + + case CH_FILE: + return true; + + case CH_CONSOLE: + { + PINPUT_RECORD pIRBuf; + DWORD NumPending; + DWORD NumPeeked; + + /* + * Peek all pending console events + */ + if (INVALID_HANDLE_VALUE == handle || + !GetNumberOfConsoleInputEvents(handle, &NumPending) || + NumPending == 0 || + NULL == (pIRBuf = (PINPUT_RECORD)_alloca(NumPending * sizeof(INPUT_RECORD)))) + return false; + + if (PeekConsoleInput(handle, pIRBuf, NumPending, &NumPeeked) && + NumPeeked != 0L && + NumPeeked <= NumPending) + { + /* + * Scan all of the peeked events to determine if any is a key event + * which should be recognized. + */ + for ( ; NumPeeked > 0 ; NumPeeked--, pIRBuf++ ) + { + if (KEY_EVENT == pIRBuf->EventType && + pIRBuf->Event.KeyEvent.bKeyDown && + pIRBuf->Event.KeyEvent.uChar.AsciiChar) + return true; + } + } + + return false; + } + + case CH_SERIAL: + { + DWORD err; + COMSTAT comStat; + + bool res = ClearCommError(handle, &err, &comStat); + assert(res); + + return res ? comStat.cbInQue > 0 : false; + } + + default: + assert(false); + return false; } -}*/ +} +#else +bool +input_avail(UCSOCKET_T fd) +{ + assert(0 <= fd); + fd_set s; + FD_ZERO(&s); + FD_SET(fd, &s); + + struct timeval tv = {0, 0}; + + int i = select(fd + 1, &s, NULL, NULL, &tv); + if (i < 0) + perror("select"); + + return i > 0; +} +#endif /* * Searching for a name in the specified table @@ -119,8 +305,8 @@ get_name_entry(struct name_entry tabl[], char *name, class cl_uc *uc) return(0); for (p= name; *p; *p= toupper(*p), p++); while (tabl[i].name && - (!(tabl[i].cpu_type & uc->type) || - (strcmp(tabl[i].name, name) != 0))) + (!(tabl[i].cpu_type & uc->type) || + (strcmp(tabl[i].name, name) != 0))) { //printf("tabl[%d].name=%s <-> %s\n",i,tabl[i].name,name); i++; @@ -138,61 +324,61 @@ get_name_entry(struct name_entry tabl[], char *name, class cl_uc *uc) /*bool interpret_bitname(char *name, class cl_uc *uc, - uchar **cell, uchar *celladdr, - uchar *bitaddr, uchar *bitmask, - char **symname) + uchar **cell, uchar *celladdr, + uchar *bitaddr, uchar *bitmask, + char **symname) { char *dot, *p; char *sym, bitnumstr[2]; struct name_entry *ne; int bitnum, i; - + if ((dot= strchr(name, '.')) != NULL) { *dot++= '\0'; if ((ne= get_name_entry(uc->sfr_tbl(), name, uc)) == NULL) - { - *celladdr= strtol(name, &p, 0); - if (p && *p) - { - dot--; - *dot= '.'; - return(DD_FALSE); - } - } + { + *celladdr= strtol(name, &p, 0); + if (p && *p) + { + dot--; + *dot= '.'; + return(DD_FALSE); + } + } else - *celladdr= ne->addr; + *celladdr= ne->addr; if ((*celladdr < 0x20) || - ((*celladdr > 0x2f) && (*celladdr < 0x80)) || - ((*celladdr > 0x7f) && (*celladdr & 0x07))) - return(DD_FALSE); + ((*celladdr > 0x2f) && (*celladdr < 0x80)) || + ((*celladdr > 0x7f) && (*celladdr & 0x07))) + return(DD_FALSE); bitnum= strtol(dot, &p, 0); if ((p && *p) || - (bitnum < 0) || - (bitnum > 7)) - return(DD_FALSE); + (bitnum < 0) || + (bitnum > 7)) + return(DD_FALSE); if (*celladdr > 0x7f) - *bitaddr= *celladdr + bitnum; + *bitaddr= *celladdr + bitnum; else - *bitaddr= (*celladdr - 0x20)*8 + bitnum; + *bitaddr= (*celladdr - 0x20)*8 + bitnum; dot--; *dot= '.'; } else { if ((ne= get_name_entry(uc->bit_tbl(), name, uc)) == NULL) - { - *bitaddr= strtol(name, &p, 0); - if ((p && *p) || - (*bitaddr > 0xff)) - return(DD_FALSE); - } + { + *bitaddr= strtol(name, &p, 0); + if ((p && *p) || + (*bitaddr > 0xff)) + return(DD_FALSE); + } else - *bitaddr= ne->addr; + *bitaddr= ne->addr; if (*bitaddr > 0x7f) - *celladdr= *bitaddr & 0xf8; + *celladdr= *bitaddr & 0xf8; else - *celladdr= (*bitaddr >> 3) + 0x20; + *celladdr= (*bitaddr >> 3) + 0x20; } // *bitaddr, *celladdr now OK *cell= uc->get_bit//FIXME @@ -203,7 +389,7 @@ interpret_bitname(char *name, class cl_uc *uc, return(DD_TRUE); i= 0; while (uc->bit_tbl()[i].name && - (uc->bit_tbl()[i].addr != *bitaddr)) + (uc->bit_tbl()[i].addr != *bitaddr)) i++; if (uc->bit_tbl()[i].name) { @@ -213,7 +399,7 @@ interpret_bitname(char *name, class cl_uc *uc, } i= 0; while (uc->sfr_tbl()[i].name && - (uc->sfr_tbl()[i].addr != *celladdr)) + (uc->sfr_tbl()[i].addr != *celladdr)) i++; if (uc->sfr_tbl()[i].name) sym= strdup(uc->sfr_tbl()[i].name); @@ -250,43 +436,43 @@ proc_escape(char *string, int *len) char *spec_c; if (*s == '\\' && - *(s+1)) - { - s++; - if (*s == '0') - { - if (!isdigit(*(s+1))) - { - *p++= '\0'; - s++; - } - else - { - char *octal, *chk, data; - int i, j; - i= strspn(s, "01234567"); - octal= (char *)malloc(i+1); - j= 0; - while (*s && - (j < i)) - octal[j++]= *s++; - octal[j]= '\0'; - data= strtol(octal, &chk, 8); - if (!chk || !(*chk)) - *p++= data; - } - } - else - if ((spec_c= strchr(spec_chars, *s)) != NULL) - { - *p++= spec[spec_c-spec_chars]; - s++; - } - else - *p++= *s++; - } + *(s+1)) + { + s++; + if (*s == '0') + { + if (!isdigit(*(s+1))) + { + *p++= '\0'; + s++; + } + else + { + char *octal, *chk, data; + int i, j; + i= strspn(s, "01234567"); + octal= (char *)malloc(i+1); + j= 0; + while (*s && + (j < i)) + octal[j++]= *s++; + octal[j]= '\0'; + data= strtol(octal, &chk, 8); + if (!chk || !(*chk)) + *p++= data; + } + } + else + if ((spec_c= strchr(spec_chars, *s)) != NULL) + { + *p++= spec[spec_c-spec_chars]; + s++; + } + else + *p++= *s++; + } else - *p++= *s++; + *p++= *s++; } *p= '\0'; *len= p-str; @@ -294,54 +480,4 @@ proc_escape(char *string, int *len) } - -extern "C" int vasprintf(char **strp, const char *format, va_list ap); -extern "C" int vsnprintf(char *str, size_t size,const char *format,va_list ap); - -int -cmd_vfprintf(FILE *f, char *format, va_list ap) -{ - int ret; - if (!f) - return(0); -#ifdef HAVE_VASPRINTF - char *msg= NULL; - vasprintf(&msg, format, ap); - ret= fprintf(f, "%s", msg); - free(msg); -#else -# ifdef HAVE_VSNPRINTF - char msg[80*25]; - vsnprintf(msg, 80*25, format, ap); - ret= fprintf(f, "%s", msg); -# else -# ifdef HAVE_VPRINTF - char msg[80*25]; - vsprintf(msg, format, ap); /* Dangerous */ - ret= fprintf(f, "%s", msg); -# else -# ifdef HAVE_DOPRNT - /* ??? */ - /*strcpy(msg, "Unimplemented printf has called.\n");*/ -# else - /*strcpy(msg, "printf can not be implemented, upgrade your libc.\n");*/ -# endif -# endif -# endif -#endif - fflush(f); - return(ret); -} - -int -cmd_fprintf(FILE *f, char *format, ...) -{ - va_list ap; - va_start(ap, format); - int ret= cmd_vfprintf(f, format, ap); - va_end(ap); - return(ret); -} - - /* End of cmd.src/cmdutil.cc */