[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);
     }