⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tools.c

📁 Gambas is a graphical development environment based on a Basic interpreter, like Visual Basic. It us
💻 C
字号:
/***************************************************************************  tools.c  Network component  (c) 2003-2004 Daniel Campos Fernández <danielcampos@netcourrier.com>  This program is free software; you can redistribute it and/or modify  it under the terms of the GNU General Public License as published by  the Free Software Foundation; either version 1, or (at your option)  any later version.  This program 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 General Public License for more details.  You should have received a copy of the GNU General Public License  along with this program; if not, write to the Free Software  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.***************************************************************************/#include "tools.h"#include "main.h"#include "gambas.h"#include <sys/poll.h>#include <termios.h>#include <fcntl.h>#include <unistd.h>#include <sys/types.h>#include <sys/stat.h>#include <sys/ioctl.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#ifdef __CYGWIN__#define FIONREAD TIOCINQ#endifvoid correct_url(char **buf,char *protocol){	char *buftmp;	int len;	int myloop,myloop2;	int pos=-1;	int myok=1;	len=strlen(*buf);	for (myloop=0;myloop<len;myloop++)	{		if ( (*buf)[myloop]==':' )		{			if (myloop==(len-1))			{				pos=myloop;				break;			}			else			{				if ( (*buf)[myloop+1]=='/' )				{					pos=myloop;					break;				}				else				{					for (myloop2=myloop+1;myloop2<len;myloop2++)					{						if ( (*buf)[myloop2]=='/' ) break;						if ( ((*buf)[myloop2]<0x30) || ((*buf)[myloop2]>0x39) )						{							myok=0;							break;						}					}					if (!myok) pos=myloop;					break;				}			}		}	}	myok=0;	if (pos==-1)	{		GB.Alloc((void**)&buftmp,len+1);		strcpy(buftmp,*buf);		GB.Free((void**)buf);		GB.Alloc((void**)buf,len+strlen(protocol)+1);		strcpy(*buf,protocol);		if (strlen(buftmp)>=2)		{			if ( buftmp[0]=='/') myok++;			if ( buftmp[1]=='/') myok++;		}		strcat(*buf,buftmp+myok);		GB.Free((void**)&buftmp);	}	else	{		GB.Alloc((void**)&buftmp,(len-pos)+1);		strcpy(buftmp,*buf+pos+1);		GB.Free((void**)buf);		GB.Alloc((void**)buf,strlen(buftmp)+strlen(protocol)+1);		strcpy(*buf,protocol);		if (strlen(buftmp)>=2)		{			if ( buftmp[0]=='/') myok++;			if ( buftmp[1]=='/') myok++;		}		strcat(*buf,buftmp+myok);		GB.Free((void**)&buftmp);	}}void Alloc_CallBack_Pointers(long nobjs,long **objs,long **scks){	if (!nobjs)	{		if (*objs)		{			GB.Free((void**)objs);			GB.Free((void**)scks);			*objs=NULL;		}		return;	}	if (*objs)	{		GB.Realloc((void**)objs,nobjs*sizeof(long));		GB.Realloc((void**)scks,nobjs*sizeof(long));	}	else	{		GB.Alloc((void**)objs,sizeof(long));		GB.Alloc((void**)scks,sizeof(long));	}}int CheckConnection(int Socket){	struct pollfd mypoll;	int numpoll;	int retval=6;	mypoll.fd=Socket;	mypoll.events=POLLERR;	mypoll.revents=0;	numpoll=poll(&mypoll,1,0);	if (numpoll>=0)	{		if (!numpoll)		{			mypoll.fd=Socket;			mypoll.events=POLLIN | POLLOUT;			mypoll.revents=0;			numpoll=poll(&mypoll,1,0);			if (numpoll<0)			{				retval=0;			}			else			{				if (numpoll>0) retval=7;			}		}		else		{			retval=0;		}	}	else	{		retval=0;	}	return retval;}/* free "buf" after using it! */int IsHostPath(char *sCad,char **buf,int *port){	/*******************	 0 --> Error	 1 --> TCP	 2 -> Unix	 *******************/	int npos=0;	int npoint=0;	int myloop;	int bufport=0;	*port=0;	*buf=NULL;	if ( sCad[0] == '/' )	{		return 2;	}	for (myloop=0;myloop<strlen(sCad);myloop++)	{		if (sCad[myloop]==':')		{			npoint++;			npos=myloop;		}	}	if (npoint != 1) return 0;	for (myloop=npos+1;myloop<strlen(sCad);myloop++)	{		if ( (sCad[myloop]<'0') || (sCad[myloop]>'9') ) return 0;		bufport*=10;		bufport+= (sCad[myloop]-48);		if ( (bufport) >65535) return 0;	}	*port=bufport;	if (npos>0)	{		GB.Alloc((void**)buf,npos);		*buf[0]=0;		sCad[npos]=0;		strcpy(*buf,sCad);		sCad[npos]=':';	}	return 1;}/******************************************************** Watching stuff ********************************************************/int search_by_integer(long *objlist,long nobj,long iData){	int myloop;	int position=0;	for (myloop=0;myloop<nobj;myloop++)	{			if ( objlist[myloop] == iData )			{				return position;				break;			}			else				position++;	}	return -1;}/******************************************************** Serial Port stuff ********************************************************/int ConvertDataBits(int nBits){	switch(nBits)	{		case 8: return CS8;		case 7: return CS7;		case 6: return CS6;		case 5: return CS5;		default: return -1;	}}int ConvertParity(int parity){  switch(parity)  {    case 0: return 0;    case 1: return PARENB;    case 2: return PARENB | PARODD;    default: return -1;  }}int ConvertStopBits(int nStop){	switch(nStop)	{		case 1: return 0;		case 2: return CSTOPB;		default: return -1;	}}int ConvertBaudRate(int nBauds){	switch(nBauds)	{		case 0:	return  B0; /*Hang UP*/		case 50:return  B50;		case 75:return  B75;		case 110:return  B110;		case 134:return  B134;		case 150:return  B150;		case 200:return  B200;		case 300:return  B300;		case 600:return  B600;		case 1200:return  B1200;		case 1800:return  B1800;		case 2400:return  B2400;		case 4800:return  B4800;		case 9600:return  B9600;		case 19200:return  B19200;		case 38400:return  B38400;		case 57600:return    B57600;		case 115200:return   B115200;		case 230400:return   B230400;    #ifdef B460800		case 460800:return   B460800;    #endif    #ifdef B500000		case 500000:return   B500000;    #endif    #ifdef B576000		case 576000:return   B576000;    #endif    #ifdef B921600		case 921600:return   B921600;    #endif    #ifdef B1000000		case 1000000:return  B1000000;    #endif    #ifdef B1152000		case 1152000:return  B1152000;    #endif    #ifdef B1500000		case 1500000:return  B1500000;    #endif    #ifdef B2000000		case 2000000:return  B2000000;    #endif    #ifdef B2500000		case 2500000:return  B2500000;    #endif    #ifdef B3000000		case 3000000:return  B3000000;    #endif    #ifdef B3500000		case 3500000:return  B3500000;    #endif    #ifdef B4000000		case 4000000:return  B4000000;    #endif		default: return -1;	}}void CloseSerialPort(int fd,struct termios *oldtio){	if (oldtio) tcsetattr(fd,TCSANOW,oldtio);	close(fd);}int OpenSerialPort(int *fd,int iflow,struct termios *oldtio,char *sName,int nBauds,int parity,int nBits,int nStop){	int Of_Baud;	int Of_Par;	int Of_Bits;	int Of_Stop;	int HardFlow=0;	int SoftFlow=0;	struct termios newtio;  switch(iflow)	{		case 1: HardFlow=CRTSCTS; break;		case 2: SoftFlow=IXON | IXOFF | IXANY; break;		case 3: HardFlow=CRTSCTS; SoftFlow=IXON | IXOFF | IXANY; break;	}	if ( (Of_Baud = ConvertBaudRate(nBauds)) == -1 ) return 1;	if ( (Of_Par = ConvertParity(parity)) == -1 ) return 2;	if ( (Of_Bits = ConvertDataBits(nBits)) == -1 ) return 3;	if ( (Of_Stop = ConvertStopBits(nStop)) == -1 ) return 4;  *fd=open(sName,O_RDWR | O_NOCTTY | O_NDELAY );	if ( (*fd) < 0 ) return 5;	if (oldtio)	{		if ( tcgetattr (*fd,oldtio) == -1)		{			close(*fd);			return 6;		}	}	if (tcgetattr (*fd,&newtio) == -1 )	{		close(*fd);		return 6;	}	// cleaning default options	newtio.c_cflag &= ~(CSIZE | CSTOPB | PARENB | PARODD | CRTSCTS);	newtio.c_iflag &= ~( INPCK | ISTRIP | IGNPAR | IXON | IXOFF | IXANY );	newtio.c_lflag &= ~( ICANON | ECHO | ECHOE | ISIG );	// setting options	newtio.c_cflag=  Of_Bits | Of_Stop | Of_Par | CLOCAL | CREAD | HUPCL | HardFlow;	if ( Of_Par & PARENB )		newtio.c_iflag=INPCK | ISTRIP;	else		newtio.c_iflag=IGNPAR;	newtio.c_iflag |= SoftFlow;	newtio.c_oflag=0;	newtio.c_cc[VMIN]=1;	newtio.c_cc[VTIME]=1;	newtio.c_cc[VSTART]=17; //DC1;	newtio.c_cc[VSTOP]=19;  //DC3;	cfsetispeed(&newtio,Of_Baud);	cfsetospeed(&newtio,Of_Baud);	tcflush(*fd,TCIFLUSH);	if ( tcsetattr(*fd,TCSANOW,&newtio) == -1)	{		close(*fd);		return 7;	}	return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -