home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / x / volume2 / xscope / part01 / AddSignal.c next >
Encoding:
C/C++ Source or Header  |  1993-04-28  |  2.3 KB  |  74 lines

  1. #include "xsignal.h"
  2. extern char *malloc();
  3.  
  4. /* ARGSUSED */
  5. void AddSignal(widget, pane, callData)
  6.     Widget widget;
  7.     sigbox *pane;
  8.     caddr_t callData;
  9. {
  10.     char *signalfile;
  11.     int fd,mask,nbytes,firstb,firsts, newsamp;
  12.     float top,shown;
  13.     char snsamp[30], *newdata;
  14.     Signal newsig;
  15.     Arg arg[4];
  16.  
  17.     signalfile = XtDialogGetValueString( XtParent(widget));
  18.     mask = 0644;
  19.     if( (fd = open(signalfile,O_RDONLY,mask)) == -1) {
  20.     perror(signalfile);
  21.         fprintf(stderr,"Signal file '%s' cannot be opened\n",signalfile);
  22.     return;
  23.     }
  24.     newsig = read_signal(fd);
  25.     close(fd);
  26.     if(pane->s == NULL) {
  27.     pane->s = newsig;
  28.     newsamp = 0;
  29.     } else {
  30.         newdata = (char *) malloc(pane->s->sig_len + newsig->sig_len);
  31.     /* Copy first part of old data */
  32.     nbytes = (pane->lmark + 1) * sizeof(short);
  33.     firstb = 0;
  34.     bcopy(&pane->s->sig_data[0],&newdata[firstb],nbytes);
  35.     /* Add new data */
  36.     firstb = nbytes;
  37.     nbytes = newsig->sig_len;
  38.     newsamp = newsig->sig_nsamp;
  39.     bcopy(&newsig->sig_data[0],&newdata[firstb],nbytes);
  40.     /* Now get the rest of the old data */
  41.     firstb += newsig->sig_len;
  42.     nbytes = pane->s->sig_len - ((pane->lmark + 1) * sizeof(short));
  43.     firsts = (pane->lmark + 1) * sizeof(short);
  44.     bcopy(&pane->s->sig_data[firsts],&newdata[firstb],nbytes);
  45.     /* Set the new length, free the old data and replace with newdata */
  46.     pane->s->sig_len += newsig->sig_len;
  47.     pane->s->sig_nsamp = pane->s->sig_len / sizeof(short);
  48.     free(pane->s->sig_data);
  49.     pane->s->sig_data = newdata;
  50.     free(newsig->sig_data);
  51.     free(newsig);
  52.     }
  53.     XtDestroyWidget(pane->file);
  54.     pane->file = (Widget) NULL;
  55.     pane->lmark = pane->first;
  56.     pane->last +=  newsamp;
  57.     pane->rmark = pane->last;
  58.     sprintf(snsamp,"%d Samples", pane->s->sig_nsamp);
  59.     XtSetArg(arg[0], XtNlabel, snsamp );
  60.     XtSetValues( pane->text_nsamp, arg, ONE );
  61.     sprintf(snsamp,"%d", pane->s->sig_nsamp);
  62.     XtSetValues( pane->endval, arg, ONE );
  63.     XtSetSensitive(pane->draw, True);
  64.     XtSetSensitive(pane->dstart, True);
  65.     XtSetSensitive(pane->dlast, True);
  66.     XtSetSensitive(pane->sb_start, True);
  67.     XtSetSensitive(pane->sb_last, True);
  68.     XtSetSensitive(pane->canvas, True);
  69.     XtSetSensitive(pane->style_button, True);
  70.     XtSetSensitive(pane->zoomcmd, True);
  71.     XtSetSensitive(pane->delcmd, True);
  72.     XtCallCallbacks(pane->draw,XtNcallback,NULL);
  73. }
  74.