Lines 106-112
Link Here
|
106 |
WAVFILE *wfile = (WAVFILE *) malloc(sizeof (WAVFILE)); |
106 |
WAVFILE *wfile = (WAVFILE *) malloc(sizeof (WAVFILE)); |
107 |
|
107 |
|
108 |
if ( wfile == NULL ) { |
108 |
if ( wfile == NULL ) { |
109 |
err("%s: Allocating WAVFILE structure",sys_errlist[ENOMEM]); |
109 |
err("%s: Allocating WAVFILE structure",strerror(ENOMEM)); |
110 |
return NULL; |
110 |
return NULL; |
111 |
} |
111 |
} |
112 |
|
112 |
|
Lines 114-120
Link Here
|
114 |
|
114 |
|
115 |
if ( (wfile->Pathname = strdup(Pathname)) == NULL ) { |
115 |
if ( (wfile->Pathname = strdup(Pathname)) == NULL ) { |
116 |
free(wfile); |
116 |
free(wfile); |
117 |
err("%s: Allocating storage for WAVFILE.Pathname",sys_errlist[ENOMEM]); |
117 |
err("%s: Allocating storage for WAVFILE.Pathname",strerror(ENOMEM)); |
118 |
return NULL; |
118 |
return NULL; |
119 |
} |
119 |
} |
120 |
|
120 |
|
Lines 166-179
Link Here
|
166 |
*/ |
166 |
*/ |
167 |
if ( (wfile->fd = open(wfile->Pathname,O_RDONLY)) < 0 ) { |
167 |
if ( (wfile->fd = open(wfile->Pathname,O_RDONLY)) < 0 ) { |
168 |
err("%s:\nOpening WAV file %s", |
168 |
err("%s:\nOpening WAV file %s", |
169 |
sys_errlist[errno], |
169 |
strerror(errno), |
170 |
wfile->Pathname); |
170 |
wfile->Pathname); |
171 |
goto errxit; |
171 |
goto errxit; |
172 |
} |
172 |
} |
173 |
|
173 |
|
174 |
if ( lseek(wfile->fd,0L,SEEK_SET) != 0L ) { |
174 |
if ( lseek(wfile->fd,0L,SEEK_SET) != 0L ) { |
175 |
err("%s:\nRewinding WAV file %s", |
175 |
err("%s:\nRewinding WAV file %s", |
176 |
sys_errlist[errno], |
176 |
strerror(errno), |
177 |
wfile->Pathname); |
177 |
wfile->Pathname); |
178 |
goto errxit; /* Wav file must be seekable device */ |
178 |
goto errxit; /* Wav file must be seekable device */ |
179 |
} |
179 |
} |
Lines 205-216
Link Here
|
205 |
* Seek to byte count and read dbytes: |
205 |
* Seek to byte count and read dbytes: |
206 |
*/ |
206 |
*/ |
207 |
if ( lseek(wfile->fd,offset,SEEK_SET) != offset ) { |
207 |
if ( lseek(wfile->fd,offset,SEEK_SET) != offset ) { |
208 |
err("%s:\nSeeking to WAV data in %s",sys_errlist[errno],wfile->Pathname); |
208 |
err("%s:\nSeeking to WAV data in %s",strerror(errno),wfile->Pathname); |
209 |
goto errxit; /* Seek failure */ |
209 |
goto errxit; /* Seek failure */ |
210 |
} |
210 |
} |
211 |
|
211 |
|
212 |
if ( read(wfile->fd,ubuf,4) != 4 ) { |
212 |
if ( read(wfile->fd,ubuf,4) != 4 ) { |
213 |
err("%s:\nReading dbytes from %s",sys_errlist[errno],wfile->Pathname); |
213 |
err("%s:\nReading dbytes from %s",strerror(errno),wfile->Pathname); |
214 |
goto errxit; |
214 |
goto errxit; |
215 |
} |
215 |
} |
216 |
|
216 |
|
Lines 308-314
Link Here
|
308 |
v_erf = erf; /* Set error reporting function */ |
308 |
v_erf = erf; /* Set error reporting function */ |
309 |
|
309 |
|
310 |
if ( wfile == NULL ) { |
310 |
if ( wfile == NULL ) { |
311 |
err("%s: WAVFILE pointer is NULL!",sys_errlist[EINVAL]); |
311 |
err("%s: WAVFILE pointer is NULL!",strerror(EINVAL)); |
312 |
errno = EINVAL; |
312 |
errno = EINVAL; |
313 |
return -1; |
313 |
return -1; |
314 |
} |
314 |
} |
Lines 322-330
Link Here
|
322 |
if ( (e = WaveReadHeader(wfile->fd,&channels,&samplerate,&sample_bits,&samples,&datastart,_v_erf)) != 0 ) |
322 |
if ( (e = WaveReadHeader(wfile->fd,&channels,&samplerate,&sample_bits,&samples,&datastart,_v_erf)) != 0 ) |
323 |
err("%s:\nReading WAV header from %s",emsg,wfile->Pathname); |
323 |
err("%s:\nReading WAV header from %s",emsg,wfile->Pathname); |
324 |
else if ( lseek(wfile->fd,(long)(datastart-4),SEEK_SET) != (long)(datastart-4) ) |
324 |
else if ( lseek(wfile->fd,(long)(datastart-4),SEEK_SET) != (long)(datastart-4) ) |
325 |
err("%s:\nSeeking in WAV header file %s",sys_errlist[errno],wfile->Pathname); |
325 |
err("%s:\nSeeking in WAV header file %s",strerror(errno),wfile->Pathname); |
326 |
else if ( write(wfile->fd,&wfile->wavinfo.Samples,sizeof wfile->wavinfo.Samples) != sizeof wfile->wavinfo.Samples ) |
326 |
else if ( write(wfile->fd,&wfile->wavinfo.Samples,sizeof wfile->wavinfo.Samples) != sizeof wfile->wavinfo.Samples ) |
327 |
err("%s:\nWriting in WAV header file %s",sys_errlist[errno],wfile->Pathname); |
327 |
err("%s:\nWriting in WAV header file %s",strerror(errno),wfile->Pathname); |
328 |
else { |
328 |
else { |
329 |
/* |
329 |
/* |
330 |
* 'data' chunk was updated OK: Now we have to update the RIFF block |
330 |
* 'data' chunk was updated OK: Now we have to update the RIFF block |
Lines 333-356
Link Here
|
333 |
*/ |
333 |
*/ |
334 |
if ( ftruncate(wfile->fd,(size_t)fpos) ) |
334 |
if ( ftruncate(wfile->fd,(size_t)fpos) ) |
335 |
err("%s:\nTruncating file %s to correct size", |
335 |
err("%s:\nTruncating file %s to correct size", |
336 |
sys_errlist[errno], |
336 |
strerror(errno), |
337 |
wfile->Pathname); |
337 |
wfile->Pathname); |
338 |
else if ( lseek(wfile->fd,4L,SEEK_SET) < 0L ) |
338 |
else if ( lseek(wfile->fd,4L,SEEK_SET) < 0L ) |
339 |
err("%s:\nSeek 4 for RIFF block update of %s", |
339 |
err("%s:\nSeek 4 for RIFF block update of %s", |
340 |
sys_errlist[errno], |
340 |
strerror(errno), |
341 |
wfile->Pathname); |
341 |
wfile->Pathname); |
342 |
else { |
342 |
else { |
343 |
fpos -= 8; /* Byte count for RIFF block */ |
343 |
fpos -= 8; /* Byte count for RIFF block */ |
344 |
if ( write(wfile->fd,&fpos,sizeof fpos) != sizeof fpos ) |
344 |
if ( write(wfile->fd,&fpos,sizeof fpos) != sizeof fpos ) |
345 |
err("%s:\nUpdate of RIFF block count in %s failed", |
345 |
err("%s:\nUpdate of RIFF block count in %s failed", |
346 |
sys_errlist[errno], |
346 |
strerror(errno), |
347 |
wfile->Pathname); |
347 |
wfile->Pathname); |
348 |
} |
348 |
} |
349 |
} |
349 |
} |
350 |
} |
350 |
} |
351 |
|
351 |
|
352 |
if ( close(wfile->fd) < 0 ) { |
352 |
if ( close(wfile->fd) < 0 ) { |
353 |
err("%s:\nClosing WAV file",sys_errlist[errno]); |
353 |
err("%s:\nClosing WAV file",strerror(errno)); |
354 |
e = errno; /* Save errno value to return */ |
354 |
e = errno; /* Save errno value to return */ |
355 |
} |
355 |
} |
356 |
|
356 |
|
Lines 385-391
Link Here
|
385 |
*/ |
385 |
*/ |
386 |
if ( (wfile->fd = open(wfile->Pathname,O_RDWR|O_TRUNC|O_CREAT,0666)) < 0 ) { |
386 |
if ( (wfile->fd = open(wfile->Pathname,O_RDWR|O_TRUNC|O_CREAT,0666)) < 0 ) { |
387 |
err("%s:\nOpening %s for WAV writing", |
387 |
err("%s:\nOpening %s for WAV writing", |
388 |
sys_errlist[errno], |
388 |
strerror(errno), |
389 |
wfile->Pathname); |
389 |
wfile->Pathname); |
390 |
return NULL; /* Open error */ |
390 |
return NULL; /* Open error */ |
391 |
} |
391 |
} |
Lines 427-433
Link Here
|
427 |
v_erf = erf; /* Set error reporting function */ |
427 |
v_erf = erf; /* Set error reporting function */ |
428 |
|
428 |
|
429 |
if ( dfile == NULL ) { |
429 |
if ( dfile == NULL ) { |
430 |
err("%s: Opening DSP device",sys_errlist[errno=ENOMEM]); |
430 |
err("%s: Opening DSP device",strerror(errno=ENOMEM)); |
431 |
return NULL; |
431 |
return NULL; |
432 |
} |
432 |
} |
433 |
|
433 |
|
Lines 439-445
Link Here
|
439 |
*/ |
439 |
*/ |
440 |
if ( (dfile->fd = open(env_AUDIODEV,omode,0)) < 0 ) { |
440 |
if ( (dfile->fd = open(env_AUDIODEV,omode,0)) < 0 ) { |
441 |
err("%s:\nOpening audio device %s", |
441 |
err("%s:\nOpening audio device %s", |
442 |
sys_errlist[errno], |
442 |
strerror(errno), |
443 |
env_AUDIODEV); |
443 |
env_AUDIODEV); |
444 |
goto errxit; |
444 |
goto errxit; |
445 |
} |
445 |
} |
Lines 449-455
Link Here
|
449 |
* setting sampling rate etc. |
449 |
* setting sampling rate etc. |
450 |
*/ |
450 |
*/ |
451 |
if ( ioctl(dfile->fd,SNDCTL_DSP_GETBLKSIZE,&dfile->dspblksiz) < 0 ) { |
451 |
if ( ioctl(dfile->fd,SNDCTL_DSP_GETBLKSIZE,&dfile->dspblksiz) < 0 ) { |
452 |
err("%s: Optaining DSP's block size",sys_errlist[errno]); |
452 |
err("%s: Optaining DSP's block size",strerror(errno)); |
453 |
goto errxit; |
453 |
goto errxit; |
454 |
} |
454 |
} |
455 |
|
455 |
|
Lines 460-466
Link Here
|
460 |
/* and 64 for 8130Hz, 8 bit */ |
460 |
/* and 64 for 8130Hz, 8 bit */ |
461 |
if ( dfile->dspblksiz < 32 || dfile->dspblksiz > 65536 ) { |
461 |
if ( dfile->dspblksiz < 32 || dfile->dspblksiz > 65536 ) { |
462 |
err("%s: Audio block size (%d bytes)", |
462 |
err("%s: Audio block size (%d bytes)", |
463 |
sys_errlist[errno=EINVAL], |
463 |
strerror(errno=EINVAL), |
464 |
(int)dfile->dspblksiz); |
464 |
(int)dfile->dspblksiz); |
465 |
goto errxit; |
465 |
goto errxit; |
466 |
} |
466 |
} |
Lines 469-475
Link Here
|
469 |
* Allocate a buffer to do the I/O through: |
469 |
* Allocate a buffer to do the I/O through: |
470 |
*/ |
470 |
*/ |
471 |
if ( (dfile->dspbuf = (char *) malloc(dfile->dspblksiz)) == NULL ) { |
471 |
if ( (dfile->dspbuf = (char *) malloc(dfile->dspblksiz)) == NULL ) { |
472 |
err("%s: For DSP I/O buffer",sys_errlist[errno]); |
472 |
err("%s: For DSP I/O buffer",strerror(errno)); |
473 |
goto errxit; |
473 |
goto errxit; |
474 |
} |
474 |
} |
475 |
|
475 |
|
Lines 478-484
Link Here
|
478 |
*/ |
478 |
*/ |
479 |
t = wfile->wavinfo.DataBits; |
479 |
t = wfile->wavinfo.DataBits; |
480 |
if ( ioctl(dfile->fd,SNDCTL_DSP_SAMPLESIZE,&t) < 0 ) { |
480 |
if ( ioctl(dfile->fd,SNDCTL_DSP_SAMPLESIZE,&t) < 0 ) { |
481 |
err("%s: Setting DSP to %u bits",sys_errlist[errno],(unsigned)t); |
481 |
err("%s: Setting DSP to %u bits",strerror(errno),(unsigned)t); |
482 |
goto errxit; |
482 |
goto errxit; |
483 |
} |
483 |
} |
484 |
|
484 |
|
Lines 488-494
Link Here
|
488 |
t = wfile->wavinfo.Channels == Stereo ? 1 : 0; |
488 |
t = wfile->wavinfo.Channels == Stereo ? 1 : 0; |
489 |
if ( ioctl(dfile->fd,SNDCTL_DSP_STEREO,&t) < 0 ) { |
489 |
if ( ioctl(dfile->fd,SNDCTL_DSP_STEREO,&t) < 0 ) { |
490 |
err("%s: Unable to set DSP to %s mode", |
490 |
err("%s: Unable to set DSP to %s mode", |
491 |
sys_errlist[errno], |
491 |
strerror(errno), |
492 |
t?"Stereo":"Mono"); |
492 |
t?"Stereo":"Mono"); |
493 |
goto errxit; |
493 |
goto errxit; |
494 |
} |
494 |
} |
Lines 498-504
Link Here
|
498 |
*/ |
498 |
*/ |
499 |
ul = wfile->wavinfo.SamplingRate; |
499 |
ul = wfile->wavinfo.SamplingRate; |
500 |
if ( ioctl(dfile->fd,SNDCTL_DSP_SPEED,&ul) < 0 ) { |
500 |
if ( ioctl(dfile->fd,SNDCTL_DSP_SPEED,&ul) < 0 ) { |
501 |
err("Unable to set audio sampling rate",sys_errlist[errno]); |
501 |
err("Unable to set audio sampling rate",strerror(errno)); |
502 |
goto errxit; |
502 |
goto errxit; |
503 |
} |
503 |
} |
504 |
|
504 |
|
Lines 530-536
Link Here
|
530 |
v_erf = erf; /* Set error reporting function */ |
530 |
v_erf = erf; /* Set error reporting function */ |
531 |
|
531 |
|
532 |
if ( dfile == NULL ) { |
532 |
if ( dfile == NULL ) { |
533 |
err("%s: DSPFILE is not open",sys_errlist[errno=EINVAL]); |
533 |
err("%s: DSPFILE is not open",strerror(errno=EINVAL)); |
534 |
return -1; |
534 |
return -1; |
535 |
} |
535 |
} |
536 |
|
536 |
|
Lines 540-546
Link Here
|
540 |
free(dfile); |
540 |
free(dfile); |
541 |
|
541 |
|
542 |
if ( close(fd) ) { |
542 |
if ( close(fd) ) { |
543 |
err("%s: Closing DSP fd %d",sys_errlist[errno],fd); |
543 |
err("%s: Closing DSP fd %d",strerror(errno),fd); |
544 |
return -1; |
544 |
return -1; |
545 |
} |
545 |
} |
546 |
|
546 |
|
Lines 565-571
Link Here
|
565 |
* Check that the WAVFILE is open for reading: |
565 |
* Check that the WAVFILE is open for reading: |
566 |
*/ |
566 |
*/ |
567 |
if ( wfile->rw != 'R' ) { |
567 |
if ( wfile->rw != 'R' ) { |
568 |
err("%s: WAVFILE must be open for reading",sys_errlist[errno=EINVAL]); |
568 |
err("%s: WAVFILE must be open for reading",strerror(errno=EINVAL)); |
569 |
return -1; |
569 |
return -1; |
570 |
} |
570 |
} |
571 |
|
571 |
|
Lines 581-587
Link Here
|
581 |
break; |
581 |
break; |
582 |
default : |
582 |
default : |
583 |
err("%s: Cannot process %u bit samples", |
583 |
err("%s: Cannot process %u bit samples", |
584 |
sys_errlist[errno=EINVAL], |
584 |
strerror(errno=EINVAL), |
585 |
(unsigned)wfile->wavinfo.DataBits); |
585 |
(unsigned)wfile->wavinfo.DataBits); |
586 |
return -1; |
586 |
return -1; |
587 |
} |
587 |
} |
Lines 593-599
Link Here
|
593 |
byte_count *= 2; /* Twice as many bytes for stereo */ |
593 |
byte_count *= 2; /* Twice as many bytes for stereo */ |
594 |
else if ( wfile->wavinfo.Channels != Mono ) { |
594 |
else if ( wfile->wavinfo.Channels != Mono ) { |
595 |
err("%s: DSPFILE control block is corrupted (chan_mode)", |
595 |
err("%s: DSPFILE control block is corrupted (chan_mode)", |
596 |
sys_errlist[errno=EINVAL]); |
596 |
strerror(errno=EINVAL)); |
597 |
return -1; |
597 |
return -1; |
598 |
} |
598 |
} |
599 |
|
599 |
|
Lines 606-612
Link Here
|
606 |
update_bytes = ((wfile->wavinfo.SamplingRate*byte_modulo) / (RECPLAY_UPDATES_PER_SEC*dfile->dspblksiz)) * dfile->dspblksiz; |
606 |
update_bytes = ((wfile->wavinfo.SamplingRate*byte_modulo) / (RECPLAY_UPDATES_PER_SEC*dfile->dspblksiz)) * dfile->dspblksiz; |
607 |
|
607 |
|
608 |
if ( ioctl(dfile->fd,SNDCTL_DSP_SYNC,0) != 0 ) |
608 |
if ( ioctl(dfile->fd,SNDCTL_DSP_SYNC,0) != 0 ) |
609 |
err("%s: ioctl(%d,SNDCTL_DSP_SYNC,0)",sys_errlist[errno]); |
609 |
err("%s: ioctl(%d,SNDCTL_DSP_SYNC,0)",strerror(errno)); |
610 |
|
610 |
|
611 |
/* Seek to requested start sample */ |
611 |
/* Seek to requested start sample */ |
612 |
lseek(wfile->fd,wfile->StartSample*byte_modulo,SEEK_CUR); |
612 |
lseek(wfile->fd,wfile->StartSample*byte_modulo,SEEK_CUR); |
Lines 620-627
Link Here
|
620 |
|
620 |
|
621 |
if ( (n = read(wfile->fd,dfile->dspbuf,bytes)) != bytes ) { |
621 |
if ( (n = read(wfile->fd,dfile->dspbuf,bytes)) != bytes ) { |
622 |
if ( n >= 0 ) |
622 |
if ( n >= 0 ) |
623 |
err("Unexpected EOF reading samples from WAV file",sys_errlist[errno=EIO]); |
623 |
err("Unexpected EOF reading samples from WAV file",strerror(errno=EIO)); |
624 |
else err("Reading samples from WAV file",sys_errlist[errno]); |
624 |
else err("Reading samples from WAV file",strerror(errno)); |
625 |
goto errxit; |
625 |
goto errxit; |
626 |
} |
626 |
} |
627 |
|
627 |
|
Lines 635-641
Link Here
|
635 |
} |
635 |
} |
636 |
|
636 |
|
637 |
if ( write(dfile->fd,dfile->dspbuf,n) != n ) { |
637 |
if ( write(dfile->fd,dfile->dspbuf,n) != n ) { |
638 |
err("Writing samples to audio device",sys_errlist[errno]); |
638 |
err("Writing samples to audio device",strerror(errno)); |
639 |
goto errxit; |
639 |
goto errxit; |
640 |
} |
640 |
} |
641 |
|
641 |
|
Lines 651-657
Link Here
|
651 |
|
651 |
|
652 |
#if 0 /* I think this is doing a destructive flush: disabled */ |
652 |
#if 0 /* I think this is doing a destructive flush: disabled */ |
653 |
if ( ioctl(dfile->fd,SNDCTL_DSP_SYNC,0) != 0 ) |
653 |
if ( ioctl(dfile->fd,SNDCTL_DSP_SYNC,0) != 0 ) |
654 |
err("%s: ioctl(%d,SNDCTL_DSP_SYNC,0)",sys_errlist[errno]); |
654 |
err("%s: ioctl(%d,SNDCTL_DSP_SYNC,0)",strerror(errno)); |
655 |
#endif |
655 |
#endif |
656 |
/* Update client time display at end of sucessful play */ |
656 |
/* Update client time display at end of sucessful play */ |
657 |
if (clntIPC >= 0) { |
657 |
if (clntIPC >= 0) { |
Lines 688-694
Link Here
|
688 |
* Check that the WAVFILE is open for writing: |
688 |
* Check that the WAVFILE is open for writing: |
689 |
*/ |
689 |
*/ |
690 |
if ( wfile->rw != 'W' ) { |
690 |
if ( wfile->rw != 'W' ) { |
691 |
err("WAVFILE must be open for writing",sys_errlist[errno=EINVAL]); |
691 |
err("WAVFILE must be open for writing",strerror(errno=EINVAL)); |
692 |
return -1; |
692 |
return -1; |
693 |
} |
693 |
} |
694 |
|
694 |
|
Lines 705-711
Link Here
|
705 |
break; |
705 |
break; |
706 |
default : |
706 |
default : |
707 |
err("Cannot process %u bit samples", |
707 |
err("Cannot process %u bit samples", |
708 |
sys_errlist[errno=EINVAL], |
708 |
strerror(errno=EINVAL), |
709 |
(unsigned)wfile->wavinfo.DataBits); |
709 |
(unsigned)wfile->wavinfo.DataBits); |
710 |
return -1; |
710 |
return -1; |
711 |
} |
711 |
} |
Lines 716-722
Link Here
|
716 |
if ( wfile->wavinfo.Channels == Stereo ) |
716 |
if ( wfile->wavinfo.Channels == Stereo ) |
717 |
byte_count *= 2; /* Twice as many bytes for stereo */ |
717 |
byte_count *= 2; /* Twice as many bytes for stereo */ |
718 |
else if ( wfile->wavinfo.Channels != Mono ) { |
718 |
else if ( wfile->wavinfo.Channels != Mono ) { |
719 |
err("DSPFILE control block is corrupted (chan_mode)",sys_errlist[errno=EINVAL]); |
719 |
err("DSPFILE control block is corrupted (chan_mode)",strerror(errno=EINVAL)); |
720 |
return -1; |
720 |
return -1; |
721 |
} |
721 |
} |
722 |
|
722 |
|
Lines 747-753
Link Here
|
747 |
* Read a block of samples: |
747 |
* Read a block of samples: |
748 |
*/ |
748 |
*/ |
749 |
if ( (n = read(dfile->fd,dfile->dspbuf,bytes)) < 0 ) { |
749 |
if ( (n = read(dfile->fd,dfile->dspbuf,bytes)) < 0 ) { |
750 |
err("Reading DSP device",sys_errlist[errno]); |
750 |
err("Reading DSP device",strerror(errno)); |
751 |
goto errxit; |
751 |
goto errxit; |
752 |
} else if ( n == 0 ) |
752 |
} else if ( n == 0 ) |
753 |
break; |
753 |
break; |
Lines 756-767
Link Here
|
756 |
* Write a block of samples to the file: |
756 |
* Write a block of samples to the file: |
757 |
*/ |
757 |
*/ |
758 |
if ( (bytes = write(wfile->fd,dfile->dspbuf,n)) < 0 ) { |
758 |
if ( (bytes = write(wfile->fd,dfile->dspbuf,n)) < 0 ) { |
759 |
err("Writing WAV samples to %s",sys_errlist[errno],wfile->Pathname); |
759 |
err("Writing WAV samples to %s",strerror(errno),wfile->Pathname); |
760 |
goto errxit; |
760 |
goto errxit; |
761 |
} else if ( bytes != n ) { |
761 |
} else if ( bytes != n ) { |
762 |
if ( bytes > 0 ) |
762 |
if ( bytes > 0 ) |
763 |
bytes_written += bytes; |
763 |
bytes_written += bytes; |
764 |
err("Did not write all WAV successfully",sys_errlist[errno=EIO]); |
764 |
err("Did not write all WAV successfully",strerror(errno=EIO)); |
765 |
goto errxit; |
765 |
goto errxit; |
766 |
} |
766 |
} |
767 |
|
767 |
|