home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Fresh Fish 10
/
Fresh_Fish_10_2352.bin
/
useful
/
disk
/
cdrom
/
mkisofs
/
trans.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-11-21
|
5KB
|
216 lines
/*
* File trans.c - scan TRANS.TBL file
*
* Written by Frank Munkert (1994).
*
*/
/*
TRANS.TBL contains lines of the kind
amigafilename->isofilename
amigafilename: any sequence of characters; special characters may be
escaped with `\`
dosfilename: "8.3" style iso file name; only letters, digits and
underscore are allowed.
All tabs and spaces will be ignored, unless they are escaped.
Examples:
drivers->DRIVERS
drivers -> DRIVERS.
file.c -> FILE.C
dow\ jones.txt -> DOWJONES.TXT
*/
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "trans.h"
#include "unix/unixlib.h"
#ifdef LATTICE
#include <proto/utility.h>
#endif
#if defined(__GNUC__) || defined(AZTEC_C)
#include <clib/utility_protos.h>
#endif
void scan_trans_tbl (struct transtbl* tbl, const char *dir_name)
{
char *tbl_file_name;
FILE *in;
static char buf[160];
char *cp;
char amiga_name[33];
char iso_name[13];
int i;
char *tmp;
struct translation* new;
int line = 0;
struct stat sbuf;
tbl->number_of_entries = 0;
tbl->entries = NULL;
tbl_file_name = malloc (strlen (dir_name) + strlen ("TRANS.TBL") + 2);
if (!tbl_file_name) {
fprintf (stderr, "out of memory!\n");
exit (1);
}
strcpy (tbl_file_name, dir_name);
if (dir_name[strlen(dir_name)-1] != ':')
strcat (tbl_file_name, "/");
strcat (tbl_file_name, "TRANS.TBL");
in = fopen (tbl_file_name, "r");
if (!in) {
free (tbl_file_name);
return;
}
for (;;) {
line++;
cp = fgets (buf, sizeof (buf), in);
if (!cp)
break;
if (!(cp = strchr (buf, '\n'))) {
fprintf (stderr, "WARNING: line too long in line %d in file %s\n",
line, tbl_file_name);
free (tbl_file_name);
return;
}
*cp = 0;
/* skip blank lines: */
if (strspn (buf, " \t") == strlen (buf))
continue;
/* read AmigaDOS name: */
for (cp=buf; isspace (*cp); cp++) ;
i=0;
while (!(cp[0] == '-' && cp[1] == '>')) {
if (*cp == 0) {
fprintf (stderr, "WARNING: missing '->' in line %d file %s\n",
line, tbl_file_name);
free (tbl_file_name);
return;
}
if (isspace (*cp)) {
cp++;
} else {
if (*cp == '\\')
cp++;
if (i == 32)
break;
amiga_name[i++] = *cp++;
}
}
cp += 2;
amiga_name[i] = 0;
/* read ISO name: */
for (; isspace (*cp); cp++) ;
i=0;
while (*cp) {
if (isspace (*cp)) {
cp++;
} else {
if (i == 12)
break;
iso_name[i++] = *cp++;
}
}
iso_name[i] = 0;
/* check if the Amiga file really exists: */
tmp = malloc (strlen (dir_name) + strlen (amiga_name) + 2);
if (!tmp) {
fprintf (stderr, "out of memory!\n");
exit (1);
}
strcpy (tmp, dir_name);
if (dir_name[strlen(dir_name)-1] != ':')
strcat (tmp, "/");
strcat (tmp, amiga_name);
if (stat (tmp, &sbuf) == -1) {
fprintf (stderr, "WARNING: file %s (from %s) not found\n",
tmp, tbl_file_name);
}
free (tmp);
/* convert iso name to uppercase: */
for (cp=iso_name; *cp; cp++)
*cp = toupper (*cp);
/* check if the iso name is valid: */
if (strspn (iso_name, "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_.")
!= strlen (iso_name)) {
fprintf (stderr, "ERROR: invalid name '%s' in file %s\n",
iso_name, tbl_file_name);
continue;
}
cp = strchr (iso_name, '.');
if ((cp && strchr (cp+1, '.')) ||
(!cp && strlen (iso_name) > 8) ||
(cp && cp-iso_name > 8) ||
(cp && strlen (iso_name) - (cp-iso_name+1) > 3) ||
(S_ISDIR(sbuf.st_mode) && cp) ||
(!S_ISDIR(sbuf.st_mode) && !cp)) {
fprintf (stderr, "ERROR: invalid name '%s' in file %s\n",
iso_name, tbl_file_name);
}
/* create table entry: */
new = (struct translation*) malloc (sizeof (*new));
if (!new) {
fprintf (stderr, "out of memory!\n");
exit (1);
}
strcpy (new->from, amiga_name);
strcpy (new->to, iso_name);
new->next = tbl->entries;
tbl->entries = new;
tbl->number_of_entries++;
}
fclose (in);
free (tbl_file_name);
}
void free_trans_tbl (struct transtbl* tbl)
{
struct translation *ptr, *next;
for (ptr = tbl->entries; ptr; ptr = next) {
next = ptr->next;
free (ptr);
}
tbl->number_of_entries = 0;
}
const char* translate (struct transtbl* tbl, const char* name)
{
struct translation *ptr;
for (ptr = tbl->entries; ptr; ptr = ptr->next) {
if (Stricmp ((UBYTE*) name, (UBYTE*) ptr->from) == 0) {
return ptr->to;
}
}
return NULL;
}