[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[DDL-ML] monitor_CmdBuf string handling patch
Hallo Torsten
Ich habe mir erddcd.c:thr_monitor() angesehen und ich glaube nicht das
Stringhandling mit bcopy(str) oder memset(str) mit Argument
strlen(str) den erwarteten Effekt hat. Deshalb ein Patch, der sowohl
das Stringhandling rund um monitor_CmdBuf als auch die störenden
Newlines vom Kommandostring im Monitoroutput behebt. Ich hoffe es
richtig hingekriegt zu haben, Stringhandling in C ist nun mal nicht
sehr lustig. Alle die -m nicht anwenden, brauchen sich um den Patch
nicht so sehr den Kopf zu zerbrechen.
Da ein normales Terminal/xterm 80 breit ist habe ich gerade noch beim
SET GL Kommando Platz für die Geschwindigkeit. Wenn man die Funktionen
sehen will (wie beim Hupen :-) muß man displaylen ändern. Das
automatisch an die Terminalbreite anzupassen war mir dann doch etwas
zu viel.
Wer gern Output mit Scroll hat, kann erddcd zusanmmen mit tr starten.
./erddcd -R -F -m | tr '\015' '\012'
Harald.
*** erddcd.c.orig Thu Dec 6 13:29:47 2001
--- erddcd.c Sat Dec 29 15:40:31 2001
***************
*** 113,119 ****
pthread_t i8255polltid=(pthread_t)NULL;
static int monitor_NrOfCnCl = 0;
! static char monitor_CmdBuf[40];
/* functions to open, initialize and close comport */
int COM_DEVICE;
--- 113,120 ----
pthread_t i8255polltid=(pthread_t)NULL;
static int monitor_NrOfCnCl = 0;
! #define MONITOR_CMDBUFLEN 40
! static char monitor_CmdBuf[MONITOR_CMDBUFLEN];
/* functions to open, initialize and close comport */
int COM_DEVICE;
***************
*** 345,363 ****
void* thr_monitor(void *v) {
int i;
! char c,buf[17];
! bzero(buf,17);
! bzero(monitor_CmdBuf,sizeof(monitor_CmdBuf));
printf("\n\nerddcd monitor\n\n");
! printf("|locos in refresh|nr of unserved|last |act |nr of |rfrsh|last\n");
! printf("|---------+------|commands in |refreshed |cmd |conn. |cycle|received\n");
! printf("|Maerklin | NMRA |queue |loco |send|clients|work |command\n");
! printf("|---------+------+--------------+----------+----+-------+-----+----------------\n");
while (1) {
if (ptid) c='Y'; else c='N';
! memset(buf,' ',15);
! for (i=0;i<15&&i<strlen(monitor_CmdBuf);i++)buf[i]=monitor_CmdBuf[i];
! printf("\r| %3d | %4d | %3d | %5d | %c | %2d | %c |%s",
monitor_NrOfMLocos(),
monitor_NrOfNLocos(),
monitor_NrOfQCmds(),
--- 346,370 ----
void* thr_monitor(void *v) {
int i;
! int displaylen = 20; /* #chars of commandstring shown in output*/
! char c,buf[MONITOR_CMDBUFLEN];
!
! if (displaylen >= MONITOR_CMDBUFLEN)
! displaylen = MONITOR_CMDBUFLEN - 1;
! bzero(monitor_CmdBuf,MONITOR_CMDBUFLEN);
printf("\n\nerddcd monitor\n\n");
! printf("|locos in refresh|# unserved|last |act |nr of |rfrsh|last\n");
! printf("|---------+------|commands |refreshed |cmd |conn. |cycle|received\n");
! printf("|Maerklin | NMRA |in queue |loco |send|clients|work |command\n");
! printf("|---------+------+----------+----------+----+-------+-----+--------------------\n");
while (1) {
if (ptid) c='Y'; else c='N';
! for (i=0; i < displaylen && monitor_CmdBuf[i] && monitor_CmdBuf[i] != '\n'; i++)
! buf[i] = monitor_CmdBuf[i];
! for ( ; i < displaylen; i++)
! buf[i] = ' ';
! buf[displaylen] = 0;
! printf("\r| %3d | %4d | %4d | %5d | %c | %2d | %c |%s",
monitor_NrOfMLocos(),
monitor_NrOfNLocos(),
monitor_NrOfQCmds(),
***************
*** 446,452 ****
#endif
monitor_NrOfCnCl++;
! bzero(monitor_CmdBuf,sizeof(monitor_CmdBuf));
while (CLIENTABORT>=0) {
memset(tmpbuf,0,MAXMSGSIZE);
--- 453,459 ----
#endif
monitor_NrOfCnCl++;
! bzero(monitor_CmdBuf, MONITOR_CMDBUFLEN);
while (CLIENTABORT>=0) {
memset(tmpbuf,0,MAXMSGSIZE);
***************
*** 472,480 ****
return 0;
}
! memset(monitor_CmdBuf,0,sizeof(monitor_CmdBuf));
! strncpy(monitor_CmdBuf,tmpbuf,sizeof(monitor_CmdBuf)-1);
!
srcp_setbuffer(tmpbuf);
CLIENTABORT=srcp_parse(sckt);
}
--- 479,486 ----
return 0;
}
! strncpy(monitor_CmdBuf,tmpbuf, MONITOR_CMDBUFLEN);
! monitor_CmdBuf[MONITOR_CMDBUFLEN - 1] = 0;
srcp_setbuffer(tmpbuf);
CLIENTABORT=srcp_parse(sckt);
}