auinfo.c
上传用户:xiejiait
上传日期:2007-01-06
资源大小:881k
文件大小:6k
源码类别:

SCSI/ASPI

开发平台:

MultiPlatform

  1. /* @(#)auinfo.c 1.3 99/10/16 Copyright 1999 J. Schilling */
  2. #ifndef lint
  3. static char sccsid[] =
  4. "@(#)auinfo.c 1.3 99/10/16 Copyright 1999 J. Schilling";
  5. #endif
  6. /*
  7.  * Copyright (c) 1998 J. Schilling
  8.  */
  9. /*
  10.  * This program is free software; you can redistribute it and/or modify
  11.  * it under the terms of the GNU General Public License as published by
  12.  * the Free Software Foundation; either version 2, or (at your option)
  13.  * any later version.
  14.  *
  15.  * This program is distributed in the hope that it will be useful,
  16.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.  * GNU General Public License for more details.
  19.  *
  20.  * You should have received a copy of the GNU General Public License
  21.  * along with this program; see the file COPYING.  If not, write to
  22.  * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  23.  */
  24. #include <mconfig.h>
  25. #include <stdxlib.h>
  26. #include <stdio.h>
  27. #include <standard.h>
  28. #include <strdefs.h>
  29. #include <deflts.h>
  30. #include <utypes.h>
  31. #include "cdrecord.h"
  32. extern int debug;
  33. EXPORT void auinfo __PR((char *name, int track, track_t *trackp));
  34. LOCAL char  *readtag __PR((char *name));
  35. EXPORT void setmcn __PR((char *mcn, track_t *trackp));
  36. LOCAL void isrc_illchar __PR((char *isrc, int c));
  37. EXPORT void setisrc __PR((char *isrc, track_t *trackp));
  38. EXPORT void setindex __PR((char *tindex, track_t *trackp));
  39. #ifdef XXX
  40. main(ac, av)
  41. int ac;
  42. char *av[];
  43. {
  44. /* auinfo("/etc/default/cdrecord");*/
  45. /* auinfo("/mnt2/CD3/audio_01.inf");*/
  46. auinfo("/mnt2/CD3/audio_01.wav");
  47. }
  48. #endif
  49. EXPORT void
  50. auinfo(name, track, trackp)
  51. char *name;
  52. int track;
  53. track_t *trackp;
  54. {
  55. char infname[1024];
  56. char *p;
  57. track_t *tp = &trackp[track];
  58. long l;
  59. long tno = -1;
  60. BOOL isdao = !is_tao(&trackp[0]);
  61. strncpy(infname, name, sizeof(infname)-1);
  62. infname[sizeof(infname)-1] = '';
  63. p = strrchr(infname, '.');
  64. if (p != 0) {
  65. strcpy(&p[1], "inf");
  66. }
  67. if (defltopen(infname) == 0) {
  68. p = readtag("CDDB_DISKID=");
  69. p = readtag("MCN=");
  70. if (p && *p)
  71. setmcn(p, &trackp[0]);
  72. p = readtag("ISRC=");
  73. if (p && *p)
  74. setisrc(p, &trackp[track]);
  75. p = readtag("Albumtitle=");
  76. p = readtag("Tracknumber=");
  77. if (p && isdao)
  78. astol(p, &tno);
  79. p = readtag("Trackstart=");
  80. if (p && isdao) {
  81. l = -1L;
  82. astol(p, &l);
  83. if (track == 1 && tno == 1 && l > 0) {
  84. trackp[1].pregapsize = 150 + l;
  85. printf("Track1 Start: '%s' (%ld)n", p, l);
  86. }
  87. }
  88. p = readtag("Tracklength=");
  89. p = readtag("Pre-emphasis=");
  90. if (p && *p) {
  91. if (strncmp(p, "yes", 3) == 0) {
  92. tp->flags |= TI_PREEMP;
  93. if (tp->tracktype == TOC_DA)
  94. tp->sectype = ST_AUDIO_PRE;
  95. } else if (strncmp(p, "no", 2) == 0) {
  96. tp->flags &= ~TI_PREEMP;
  97. if (tp->tracktype == TOC_DA)
  98. tp->sectype = ST_AUDIO_NOPRE;
  99. }
  100. }
  101. p = readtag("Channels=");
  102. p = readtag("Copy_permitted=");
  103. if (p && *p) {
  104. if (strncmp(p, "yes", 3) == 0)
  105. tp->flags |= TI_COPY;
  106. }
  107. p = readtag("Endianess=");
  108. p = readtag("Index=");
  109. if (p && *p && isdao)
  110. setindex(p, &trackp[track]);
  111. p = readtag("Index0=");
  112. if (p && isdao) {
  113. long ts;
  114. long ps;
  115. l = -2L;
  116. astol(p, &l);
  117. if (l == -1) {
  118. trackp[track+1].pregapsize = 0;
  119. } else if (l > 0) {
  120. ts = tp->tracksize / 2352;
  121. ps = ts - l;
  122. if (ps > 0)
  123. trackp[track+1].pregapsize = ps;
  124. }
  125. }
  126. }
  127. }
  128. LOCAL char *
  129. readtag(name)
  130. char *name;
  131. {
  132. char *p;
  133. p = defltread(name);
  134. if (p) {
  135. while (*p == ' ' || *p == 't')
  136. p++;
  137. if (debug)
  138. printf("%s '%s'n", name, p);
  139. }
  140. return (p);
  141. }
  142. EXPORT void
  143. setmcn(mcn, trackp)
  144. char *mcn;
  145. track_t *trackp;
  146. {
  147. char *p;
  148. if (strlen(mcn) != 13)
  149. comerrno(EX_BAD, "MCN '%s' has illegal length.n", mcn);
  150. for (p = mcn; *p; p++) {
  151. if (*p < '0' || *p > '9')
  152. comerrno(EX_BAD, "MCN '%s' contains illegal character '%c'.n", mcn, *p);
  153. }
  154. p = malloc(14);
  155. strcpy (p, mcn);
  156. trackp->isrc = p;
  157. if (debug)
  158. printf("Track %d MCN: '%s'n", trackp->trackno, trackp->isrc);
  159. }
  160. LOCAL char upper[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  161. LOCAL void
  162. isrc_illchar(isrc, c)
  163. char *isrc;
  164. int c;
  165. {
  166. errmsgno(EX_BAD, "ISRC '%s' contains illegal character '%c'.n", isrc, c);
  167. }
  168. EXPORT void
  169. setisrc(isrc, trackp)
  170. char *isrc;
  171. track_t *trackp;
  172. {
  173. char ibuf[13];
  174. char *ip;
  175. char *p;
  176. int i;
  177. int len;
  178. if ((len = strlen(isrc)) != 12) {
  179. for (p = isrc, i = 0; *p; p++) {
  180. if (*p == '-')
  181. i++;
  182. }
  183. if (((len - i) != 12) || i > 3)
  184. comerrno(EX_BAD, "ISRC '%s' has illegal length.n", isrc);
  185. }
  186. /*
  187.  * The country code.
  188.  */
  189. for (p = isrc, ip = ibuf, i = 0; i < 2; p++, i++) {
  190. *ip++ = *p;
  191. if (!strchr(upper, *p)) {
  192. /* goto illchar;*/
  193. isrc_illchar(isrc, *p);
  194. if (*p >= '0' && *p <= '9')
  195. continue;
  196. exit(EX_BAD);
  197. }
  198. }
  199. if (*p == '-')
  200. p++;
  201. /*
  202.  * The XXX code.
  203.  */
  204. for (i = 0; i < 3; p++, i++) {
  205. *ip++ = *p;
  206. if (strchr(upper, *p))
  207. continue;
  208. if (*p >= '0' && *p <= '9')
  209. continue;
  210. goto illchar;
  211. }
  212. if (*p == '-')
  213. p++;
  214. /*
  215.  * The Year and the recording number.
  216.  */
  217. for (i = 0; i < 7; p++, i++) {
  218. *ip++ = *p;
  219. if (*p >= '0' && *p <= '9')
  220. continue;
  221. if (*p == '-' && i == 2) {
  222. ip--;
  223. i--;
  224. continue;
  225. }
  226. goto illchar;
  227. }
  228. *ip = '';
  229. p = malloc(13);
  230. strcpy (p, ibuf);
  231. trackp->isrc = p;
  232. if (debug)
  233. printf("Track %d ISRC: '%s'n", trackp->trackno, trackp->isrc);
  234. return;
  235. illchar:
  236. isrc_illchar(isrc, *p);
  237. exit(EX_BAD);
  238. }
  239. EXPORT void
  240. setindex(tindex, trackp)
  241. char *tindex;
  242. track_t *trackp;
  243. {
  244. char *p;
  245. int i;
  246. int nindex;
  247. long idx;
  248. long *idxlist;
  249. idxlist = (long *)malloc(100*sizeof(long));
  250. p = tindex;
  251. idxlist[0] = 0;
  252. i = 0;
  253. while (*p) {
  254. p = astol(p, &idx);
  255. if (*p != '' && *p != ' ' && *p != 't' && *p != ',')
  256. goto illchar;
  257. i++;
  258. if (i > 99)
  259. comerrno(EX_BAD, "Too many indices for track %dn", trackp->trackno);
  260. idxlist[i] = idx;
  261. if (*p == ',')
  262. p++;
  263. while (*p == ' ' || *p == 't')
  264. p++;
  265. }
  266. nindex = i;
  267. if (debug)
  268. printf("Track %d %d Index: '%s'n", trackp->trackno, i, tindex);
  269. if (debug) for (i=0; i <= nindex; i++)
  270. printf("%d: %ldn", i, idxlist[i]);
  271. trackp->nindex = nindex;
  272. trackp->tindex = idxlist;
  273. if (debug && nindex > 1)
  274. exit(1);
  275. return;
  276. illchar:
  277. comerrno(EX_BAD, "Index '%s' contains illegal character '%c'.n", tindex, *p);
  278. }