ref: efad487ddcfd58db200cab4389a5856b97c0b26f
dir: /src/misc.c/
/*
* July 5, 1991
* Copyright 1991 Lance Norskog And Sundry Contributors
* This source code is freely redistributable and may be used for
* any purpose. This copyright notice must be maintained.
* Lance Norskog And Sundry Contributors are not responsible for
* the consequences of using this software.
*/
/*
* Sound Tools miscellaneous stuff.
*/
#include "st.h"
#include "version.h"
#include "patchlvl.h"
#include <stdio.h>
#include <time.h>
EXPORT char *sizes[] = {
"NONSENSE!",
"bytes",
"shorts",
"NONSENSE",
"longs",
"32-bit floats",
"64-bit floats",
"IEEE floats"
};
EXPORT char *styles[] = {
"NONSENSE!",
"unsigned",
"signed (2's complement)",
"u-law",
"a-law",
"adpcm",
"gsm"
};
char readerr[] = "Premature EOF while reading sample file.";
char writerr[] = "Error writing sample file. You are probably out of disk space.";
/* Utilities */
/* Read and write words and longs in "machine format". Swap if indicated. */
/* Read short. */
unsigned short
rshort(ft)
ft_t ft;
{
unsigned short us;
fread(&us, 2, 1, ft->fp);
if (ft->swap)
us = swapw(us);
return us;
}
/* Write short. */
unsigned short
#if defined(__STDC__)
wshort(ft_t ft, unsigned short us)
#else
wshort(ft, us)
ft_t ft;
unsigned short us;
#endif
{
if (ft->swap)
us = swapw(us);
if (fwrite(&us, 2, 1, ft->fp) != 1)
fail(writerr);
return(0);
}
/* Read long. */
ULONG
rlong(ft)
ft_t ft;
{
ULONG ul;
fread(&ul, 4, 1, ft->fp);
if (ft->swap)
ul = swapl(ul);
return ul;
}
/* Write long. */
ULONG
wlong(ft, ul)
ft_t ft;
ULONG ul;
{
if (ft->swap)
ul = swapl(ul);
if (fwrite(&ul, 4, 1, ft->fp) != 1)
fail(writerr);
return(0);
}
/* Read float. */
float
rfloat(ft)
ft_t ft;
{
float f;
fread(&f, sizeof(float), 1, ft->fp);
if (ft->swap)
f = swapf(f);
return f;
}
void
wfloat(ft, f)
ft_t ft;
float f;
{
float t = f;
if (ft->swap)
t = swapf(t);
if (fwrite(&t, sizeof(float), 1, ft->fp) != 1)
fail(writerr);
}
/* Read double. */
double
rdouble(ft)
ft_t ft;
{
double d;
fread(&d, sizeof(double), 1, ft->fp);
if (ft->swap)
d = swapd(d);
return d;
}
/* Write double. */
void
wdouble(ft, d)
ft_t ft;
double d;
{
if (ft->swap)
d = swapd(d);
if (fwrite(&d, sizeof(double), 1, ft->fp) != 1)
fail(writerr);
}
/* generic swap routine */
static void
swapb(l, f, n)
char *l, *f;
int n;
{ register int i;
for (i= 0; i< n; i++)
f[i]= l[n-i-1];
}
/* Byte swappers */
unsigned short
#if defined(__STDC__)
swapw(unsigned short us)
#else
swapw(us)
unsigned short us;
#endif
{
return ((us >> 8) | (us << 8)) & 0xffff;
}
ULONG
swapl(ul)
ULONG ul;
{
return (ul >> 24) | ((ul >> 8) & 0xff00) | ((ul << 8) & 0xff0000L) | (ul << 24);
}
/* return swapped 32-bit float */
float
#if defined(__STDC__)
swapf(float uf)
#else
swapf(uf)
float uf;
#endif
{
union {
ULONG l;
float f;
} u;
u.f= uf;
u.l= (u.l>>24) | ((u.l>>8)&0xff00) | ((u.l<<8)&0xff0000L) | (u.l<<24);
return u.f;
}
double
swapd(df)
double df;
{
double sdf;
swapb(&df, &sdf, sizeof(double));
return (sdf);
}
/* dummy routines for do-nothing functions */
void nothing() {}
LONG nothing_success() {return(0);}
/* dummy drain routine for effects */
void null_drain(effp, obuf, osamp)
eff_t effp;
LONG *obuf;
LONG *osamp;
{
*osamp = 0;
}
/* here for linear interp. might be useful for other things */
LONG gcd(a, b)
LONG a, b;
{
if (b == 0)
return a;
else
return gcd(b, a % b);
}
LONG lcm(a, b)
LONG a, b;
{
return (a * b) / gcd(a, b);
}
/*
* Cribbed from Unix SVR3 programmer's manual
*/
static ULONG rand15_seed;
ULONG rand15() {
rand15_seed = (rand15_seed * 1103515245L) + 12345L;
return (ULONG) ((rand15_seed/65536L) % 32768L);
}
void srand15(seed)
ULONG seed;
{
rand15_seed = seed;
}
void newrand15() {
time_t t;
time(&t);
srand15(t);
}
/* sine wave gen should be here, also */
char *
version()
{
static char versionstr[20];
sprintf(versionstr, "Version %d.%d", VERSION, PATCHLEVEL);
return(versionstr);
}
#ifndef HAVE_STRERROR
/* strerror function */
char *strerror(errcode)
int errcode;
{
static char nomesg[30];
extern int sys_nerr;
extern char *sys_errlist[];
if (errcode < sys_nerr)
return (sys_errlist[errcode]);
else
{
sprintf (nomesg, "Undocumented error %d", errcode);
return (nomesg);
}
}
#endif