util.cc
上传用户:weiliju62
上传日期:2007-01-06
资源大小:619k
文件大小:5k
源码类别:

SCSI/ASPI

开发平台:

MultiPlatform

  1. /*  cdrdao - write audio CD-Rs in disc-at-once mode
  2.  *
  3.  *  Copyright (C) 1998  Andreas Mueller <mueller@daneb.ping.de>
  4.  *
  5.  *  This program is free software; you can redistribute it and/or modify
  6.  *  it under the terms of the GNU General Public License as published by
  7.  *  the Free Software Foundation; either version 2 of the License, or
  8.  *  (at your option) any later version.
  9.  *
  10.  *  This program is distributed in the hope that it will be useful,
  11.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.  *  GNU General Public License for more details.
  14.  *
  15.  *  You should have received a copy of the GNU General Public License
  16.  *  along with this program; if not, write to the Free Software
  17.  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18.  */
  19. /*
  20.  * $Log: util.cc,v $
  21.  * Revision 1.7  1999/03/27 19:51:04  mueller
  22.  * Added 'strdup3CC()'.
  23.  *
  24.  * Revision 1.6  1999/01/24 15:59:02  mueller
  25.  * Moved 'audioDataLength()', 'audioFileType()' and 'waveHeaderLength()'
  26.  * to class 'AudioData'.
  27.  *
  28.  * Revision 1.5  1998/10/03 14:32:31  mueller
  29.  * Applied patch from Bjoern Fischer <bfischer@Techfak.Uni-Bielefeld.DE>.
  30.  *
  31.  * Revision 1.4  1998/09/06 12:00:26  mueller
  32.  * Used 'message' function for messages.
  33.  *
  34.  * Revision 1.3  1998/08/15 12:41:32  mueller
  35.  * Ignore case when checking for '.wav' extension.
  36.  * Suggested by Paul Martin <pm@nowster.zetnet.co.uk>.
  37.  *
  38.  */
  39. static char rcsid[] = "$Id: util.cc,v 1.7 1999/03/27 19:51:04 mueller Exp mueller $";
  40. #include <config.h>
  41. #include <stdio.h>
  42. #include <unistd.h>
  43. #include <limits.h>
  44. #include <string.h>
  45. #include <errno.h>
  46. #include <sys/types.h>
  47. #include <sys/stat.h>
  48. #include <fcntl.h>
  49. #include "util.h"
  50. #include "Sample.h"
  51. char *strdupCC(const char *s)
  52. {
  53.   char *ret;
  54.   long len;
  55.   if (s == NULL) {
  56.     return NULL;
  57.   }
  58.   len = strlen(s);
  59.   ret = new char[len + 1];
  60.   strcpy(ret, s);
  61.   return ret;
  62. }
  63. char *strdup3CC(const char *s1, const char *s2, const char *s3)
  64. {
  65.   char *ret;
  66.   long len = 0;
  67.   if (s1 == NULL && s2 == NULL && s3 == NULL)
  68.     return NULL;
  69.   if (s1 != NULL)
  70.     len = strlen(s1);
  71.   if (s2 != NULL)
  72.     len += strlen(s2);
  73.   if (s3 != NULL)
  74.     len += strlen(s3);
  75.   ret = new char[len + 1];
  76.   *ret = 0;
  77.   if (s1 != NULL)
  78.     strcpy(ret, s1);
  79.   if (s2 != NULL)
  80.     strcat(ret, s2);
  81.   if (s3 != NULL)
  82.     strcat(ret, s3);
  83.   return ret;
  84. }
  85. long fullRead(int fd, void *buf, long count)
  86. {
  87.   long n = 0;
  88.   long nread = 0;
  89.   
  90.   do {
  91.     do {
  92.       n = read(fd, (char *)buf + nread, count);
  93.     } while (n < 0 && (errno == EAGAIN || errno == EINTR));
  94.     if (n < 0) {
  95.       return -1;
  96.     }
  97.     if (n == 0) {
  98.       return nread;
  99.     }
  100.     
  101.     count -= n;
  102.     nread += n;
  103.   } while (count > 0);
  104.   return nread;
  105. }
  106. long fullWrite(int fd, const void *buf, long count)
  107. {
  108.   long n;
  109.   long nwritten = 0;
  110.   const char *p = (const char *)buf;
  111.   do {
  112.     do {
  113.       n = write(fd, p, count);
  114.     } while (n < 0 && (errno == EAGAIN || errno == EINTR));
  115.     if (n < 0)
  116.       return -1;
  117.     if (n == 0)
  118.       return nwritten;
  119.     count -= n;
  120.     nwritten += n;
  121.     p += n;
  122.   } while (count > 0);
  123.   return nwritten;
  124. }
  125.   
  126. long readLong(FILE *fp)
  127. {
  128.   unsigned char c1 = getc(fp);
  129.   unsigned char c2 = getc(fp);
  130.   unsigned char c3 = getc(fp);
  131.   unsigned char c4 = getc(fp);
  132.   return ((long)c4 << 24) | ((long)c3 << 16) | ((long)c2 << 8) | (long)c1;
  133. }
  134. short readShort(FILE *fp)
  135. {
  136.   unsigned char c1 = getc(fp);
  137.   unsigned char c2 = getc(fp);
  138.   return ((short)c2 << 8) | (short)c1;
  139. }
  140. void swapSamples(Sample *buf, unsigned long len)
  141. {
  142.   unsigned long i;
  143.   for (i = 0; i < len; i++) {
  144.     buf[i].swap();
  145.   }
  146. }
  147. unsigned char int2bcd(int d)
  148. {
  149.   if (d >= 0 && d <= 99)
  150.     return ((d / 10) << 4) | (d % 10);
  151.   else 
  152.     return d;
  153. }
  154. int bcd2int(unsigned char d)
  155. {
  156.   unsigned char d1 = d & 0x0f;
  157.   unsigned char d2 = d >> 4;
  158.   if (d1 <= 9 && d2 <= 9) {
  159.     return d2 * 10 + d1;
  160.   }
  161.   else {
  162.     return d;
  163.   }
  164. }
  165. const char *stripCwd(const char *fname)
  166. {
  167.   static char *buf = NULL;
  168.   static long bufLen = 0;
  169.   char cwd[PATH_MAX + 1];
  170.   long len;
  171.   
  172.   if (fname == NULL)
  173.     return NULL;
  174.   len = strlen(fname);
  175.   if (buf == NULL || len >= bufLen) {
  176.     bufLen = len + 1;
  177.     delete[] buf;
  178.     buf = new char[bufLen];
  179.   }
  180.   if (getcwd(cwd, PATH_MAX + 1) == NULL) {
  181.     // if we cannot retrieve the current working directory return 'fname'
  182.     strcpy(buf, fname);
  183.   }
  184.   else {
  185.     len = strlen(cwd);
  186.     if (strncmp(cwd, fname, len) == 0) {
  187.       if (*(fname + len) == '/')
  188. strcpy(buf, fname + len + 1);
  189.       else
  190. strcpy(buf, fname + len);
  191.       if (buf[0] == 0) {
  192. // resulting filename would be "" -> return 'fname'
  193. strcpy(buf, fname);
  194.       }
  195.     }
  196.     else {
  197.       strcpy(buf, fname);
  198.     }
  199.   }
  200.   return buf;
  201. }