BuildCommDCB16 had a rather broken baud rate handling.

This commit is contained in:
Andreas Mohr 2001-02-23 01:10:50 +00:00 committed by Alexandre Julliard
parent a3a0251515
commit 92285494a9

View File

@ -380,7 +380,7 @@ static void comm_waitwrite(struct DosDeviceStruct *ptr)
*/ */
BOOL16 WINAPI BuildCommDCB16(LPCSTR device, LPDCB16 lpdcb) BOOL16 WINAPI BuildCommDCB16(LPCSTR device, LPDCB16 lpdcb)
{ {
/* "COM1:9600,n,8,1" */ /* "COM1:96,n,8,1" */
/* 012345 */ /* 012345 */
int port; int port;
char *ptr, temp[256]; char *ptr, temp[256];
@ -417,7 +417,41 @@ BOOL16 WINAPI BuildCommDCB16(LPCSTR device, LPDCB16 lpdcb)
if (COM[port].baudrate > 0) if (COM[port].baudrate > 0)
lpdcb->BaudRate = COM[port].baudrate; lpdcb->BaudRate = COM[port].baudrate;
else else
lpdcb->BaudRate = atoi(ptr); {
int rate;
/* DOS/Windows only compares the first two numbers
* and assigns an appropriate baud rate.
* You can supply 961324245, it still returns 9600 ! */
if (strlen(ptr) < 2)
{
WARN("Unknown baudrate string '%s' !\n", ptr);
return -1; /* error: less than 2 chars */
}
ptr[2] = '\0';
rate = atoi(ptr);
switch (rate) {
case 11:
case 30:
case 60:
rate *= 10;
break;
case 12:
case 24:
case 48:
case 96:
rate *= 100;
break;
case 19:
rate = 19200;
break;
default:
WARN("Unknown baudrate indicator %d !\n", rate);
return -1;
}
lpdcb->BaudRate = rate;
}
TRACE("baudrate (%d)\n", lpdcb->BaudRate); TRACE("baudrate (%d)\n", lpdcb->BaudRate);
ptr = strtok(NULL, ", "); ptr = strtok(NULL, ", ");