cdjob.c
上传用户:weiliju62
上传日期:2007-01-06
资源大小:619k
文件大小:5k
- /* cdjob.c
- *
- * Copyright (C) 1999 Fabio Baracca <fabiobar@tiscalinet.it>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
- #include <stdio.h>
- #include <string.h>
- #define BUF_S 1024
- #define DATA_SIGN "DATAFILE"
- #define AUDIO_SIGN "FILE"
- #define TRACKTYPE_SIGN "TRACK"
- #define MODE1_SIGN "MODE1"
- #define MODE2_SIGN "MODE2"
- #define SECT_SIZE 2048
- FILE *inf, *outf, *device;
- char *fname, *track_info, *cdrom_device;
- char buf[BUF_S], file_to_read[BUF_S];
- int is_data_track = 0, line_count = 0;
- int i, j, k, x, data_size, chr;
- int min, sec, frame, size_in_sect, rcode = 0, rem, readin;
- int audio_begin = 0, audio_end = 0, tracks = 0, prevseek = 0;
- int main(int argc, char *argv[])
- {
- if (argc != 3) {
- fprintf(stderr, "Usage: %s <cue-sheet> <cdrom device>n", argv[0]);
- return 1;
- }
- fname = argv[1];
- cdrom_device = argv[2];
- inf = (FILE *) fopen(fname, "r+");
- if (inf == NULL) {
- fprintf(stderr, "Unable to open "%s" cue-sheet!n", fname);
- return 2;
- }
- device = (FILE *) fopen(cdrom_device, "r");
- /*
- if (device == NULL) {
- fprintf(stderr, "Unable to open "%s" for reading!n", cdrom_device);
- return 4;
- }
- fclose (device);
- */
- /* Testing for PSX CD */
- sprintf (buf, "psxdump -T -d %s", cdrom_device);
- i=system (buf);
-
- if (i!=0) {
- fprintf(stderr, "Unable to read from %s or disk is not PSX, please check and retry.n", cdrom_device);
- exit (1);
- }
-
- /* Total bytes (about to) read */
- readin = 0;
- printf("cdjob 0.2 - Fabio Baracca <fabiobar@tiscalinet.it>nn");
- while (!feof(inf)) {
- prevseek=ftell (inf);
- fgets(buf, BUF_S, inf);
- if (!feof(inf)) {
- line_count++;
- /* Store data type */
- if (strncasecmp(buf, TRACKTYPE_SIGN, strlen(TRACKTYPE_SIGN)) == 0) {
- if (strstr(buf, MODE1_SIGN))
- is_data_track = 1;
- else if (strstr(buf, MODE2_SIGN)) { /* HACK IT! */
- is_data_track = 1;
- buf[11]=0x20;
- buf[12]='/';
- buf[13]='/';
- fseek (inf, prevseek, SEEK_SET);
- fputs (buf, inf);
- }
- else
- is_data_track = 0;
- }
- /* Data to be read.. */
- if ((strncasecmp(buf, DATA_SIGN, strlen(DATA_SIGN)) == 0) ||
- (strncasecmp(buf, AUDIO_SIGN, strlen(AUDIO_SIGN)) == 0)) {
- /* Zero vars */
- i = j = k = x = 0;
- /* Search the name */
- for (j = 0, i = 0; i < strlen(buf); i++) {
- if (buf[i] == '"') {
- j++;
- if (j == 1)
- k = i + 1;
- else if (j >= 2) {
- x = i - 1;
- break;
- }
- }
- }
- /* Check the name */
- if (j != 2) {
- fprintf(stderr, "Bogus characters at line %dn", line_count);
- rcode = 100;
- } else if ((x - k + 1) > BUF_S) {
- fprintf(stderr, "Ooppss.. filename too long..n");
- rcode = 101;
- } else {
- strcpy(file_to_read, buf + k);
- /* Track size info */
- track_info = buf + x + 2;
- for (j = 0, i = x + 2; i < strlen(buf); i++) {
- if (buf[i] == ':') {
- j++;
- if (j >= 2) {
- track_info[i - x + 1] = 0;
- break;
- }
- }
- }
- x -= k;
- file_to_read[++x] = 0;
- if (!is_data_track) { /* audio ? :-D */
- tracks++;
- if (audio_begin != 0)
- audio_end = tracks;
- else
- audio_begin = tracks;
- }
- if (is_data_track) {
- tracks++;
- /* printf("About data file: "%s"..", file_to_read);*/
- if ((sscanf(track_info, "%d:%d:%d", &min, &sec, &frame)) != 3) {
- printf("bogus size info!n");
- rcode = 102;
- } else {
- char toshell[1024]; /* HACK!!! */
- size_in_sect = (((min * 60 + sec) * 75 + frame) * SECT_SIZE);
- track_info[1]=0x20;
- track_info[2]='/';
- track_info[3]='/';
- fseek (inf, prevseek, SEEK_SET);
- fputs (buf, inf);
-
- sprintf (toshell, "psxdump -f %s -d %s", file_to_read, cdrom_device);
- system (toshell);
- }
- } else {
- /* Silenty trash garbage */
- /* printf ("mm.. not a data file.. ignoring!n"); */
- /* rcode=200; */
- }
- }
- }
- }
- }
- fclose(inf);
- fclose(device);
- if (audio_begin != 0) { /* Start cdparanoia */
- printf("Ok.. now reading audio part of the disk.nn");
- sprintf(buf, "cdparanoia -z %d- data.wav", audio_begin);
- if (system(buf) != 0)
- fprintf(stderr, "nnCdparanoia execution error. - CD dump can be corrupted.n");
- }
- printf ("n");
- return rcode;
- }