ref: 8508e91aaf1ffbbd193791c19cfcbe161ef53160
dir: /util.c/
#include <u.h>
#include <libc.h>
#include <tos.h>
int usensec = 0;
static int b2i[255] = {
['0'] = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
['a'] = 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
['k'] = 20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
['u'] = 30, 31, 32, 33, 34, 35,
['A'] = 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
['K'] = 20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
['U'] = 30, 31, 32, 33, 34, 35,
};
static float notes[/* octave */]['g'-'A'+1 /* note */] = {
#include "a440.h"
};
int
i36(uchar c)
{
return b2i[c];
}
float
note2freq(uchar note, uchar octave)
{
note -= 'A';
octave -= '0';
if (octave >= nelem(notes) || note >= nelem(notes[0]))
return 0.0;
return notes[octave][note];
}
int
pathopen(char *path, char *fmt, ...)
{
va_list arg;
char *s;
int fd;
va_start(arg, fmt);
s = vsmprint(fmt, arg);
va_end(arg);
if (s == nil || (path = smprint("%s/%s", path, s)) == nil)
sysfatal("memory");
free(s);
if ((fd = open(path, OWRITE)) < 0)
fprint(2, "%s: %r\n", path);
free(path);
return fd;
}
/*
* nsec() is wallclock and can be adjusted by timesync
* so need to use cycles() instead, but fall back to
* nsec() in case we can't
*/
uvlong
nanosec(void)
{
static uvlong fasthz, xstart;
uvlong x, div;
if(fasthz == ~0ULL)
return nsec() - xstart;
if(fasthz == 0){
fasthz = _tos->cyclefreq;
if(fasthz == 0){
fasthz = ~0ULL;
xstart = nsec();
fprint(2, "cyclefreq not available, falling back to nsec()\n");
fprint(2, "you might want to disable aux/timesync\n");
return 0;
}
cycles(&xstart);
return 0;
}
cycles(&x);
x -= xstart;
/* this is ugly */
for(div = 1000000000ULL; x < 0x1999999999999999ULL && div > 1 ; div /= 10ULL, x *= 10ULL);
return x / (fasthz / div);
}