rhubarb-lip-sync/lib/flite-1.4/src/utils/cst_file_palmos.c

308 lines
8.2 KiB
C
Raw Normal View History

/*************************************************************************/
/* */
/* Language Technologies Institute */
/* Carnegie Mellon University */
/* Copyright (c) 2001 */
/* All Rights Reserved. */
/* */
/* Permission is hereby granted, free of charge, to use and distribute */
/* this software and its documentation without restriction, including */
/* without limitation the rights to use, copy, modify, merge, publish, */
/* distribute, sublicense, and/or sell copies of this work, and to */
/* permit persons to whom this work is furnished to do so, subject to */
/* the following conditions: */
/* 1. The code must retain the above copyright notice, this list of */
/* conditions and the following disclaimer. */
/* 2. Any modifications must be clearly marked as such. */
/* 3. Original authors' names are not deleted. */
/* 4. The authors' names are not used to endorse or promote products */
/* derived from this software without specific prior written */
/* permission. */
/* */
/* CARNEGIE MELLON UNIVERSITY AND THE CONTRIBUTORS TO THIS WORK */
/* DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING */
/* ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT */
/* SHALL CARNEGIE MELLON UNIVERSITY NOR THE CONTRIBUTORS BE LIABLE */
/* FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES */
/* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN */
/* AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, */
/* ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF */
/* THIS SOFTWARE. */
/* */
/*************************************************************************/
/* Author: Alan W Black <awb@cs.cmu.edu> */
/* Date: July 2004 */
/*************************************************************************/
/* */
/* File I/O wrappers for PalmOS platforms. */
/* */
/* flop/armflite currently (Jan 05) only uses cst_sprintf */
/* */
/*************************************************************************/
#include "cst_file.h"
#include "cst_error.h"
#include "cst_alloc.h"
#define _STDIO_PALM_C_
#include <PalmOS.h>
#include <StdIOPalm.h>
#include <System/FileStream.h>
#include <string.h>
#include <stdarg.h>
cst_file cst_fopen(const char *path, int mode)
{
/* This is kind of hacky. */
if ((mode & CST_OPEN_WRITE) && (mode & CST_OPEN_READ))
return FileOpen(0, path, 0, 0, fileModeReadWrite, NULL);
else if ((mode & CST_OPEN_APPEND) && (mode & CST_OPEN_READ))
return FileOpen(0, path, 0, 0,
fileModeAppend | fileModeReadWrite, NULL);
else if (mode & CST_OPEN_WRITE)
return FileOpen(0, path, 0, 0, fileModeReadWrite, NULL);
else if (mode & CST_OPEN_APPEND)
return FileOpen(0, path, 0, 0, fileModeAppend, NULL);
else if (mode & CST_OPEN_READ)
return FileOpen(0, path, 0, 0, fileModeReadOnly, NULL);
else
return FileOpen(0, path, 0, 0, fileModeReadOnly, NULL);
}
long cst_fwrite(cst_file fh, const void *buf, long size, long count)
{
return FileWrite(fh, buf, size, count, NULL);
}
long cst_fread(cst_file fh, void *buf, long size, long count)
{
return FileRead(fh,buf,size,count,NULL);
}
long cst_filesize(cst_file fh)
{
long epos=0;
FileTell(fh,&epos,NULL);
return epos;
}
int cst_fgetc(cst_file fh)
{
return fgetc(fh);
}
long cst_ftell(cst_file fh)
{
return FileTell(fh,NULL,NULL);
}
long cst_fseek(cst_file fh, long pos, int whence)
{
FileOriginEnum w = fileOriginBeginning;
if (whence == CST_SEEK_ABSOLUTE)
w = fileOriginBeginning;
else if (whence == CST_SEEK_RELATIVE)
w = fileOriginCurrent;
else if (whence == CST_SEEK_ENDREL)
w = fileOriginEnd;
return FileSeek(fh, pos, w);
}
int cst_fclose(cst_file fh)
{
return FileClose(fh);
}
static int po_itoa(char *s, int i, const char* modifier)
{ /* print ascii representation of i to s with any modifier (e.g. "03") */
char n[20]; /* numbers cannot be bigger than 20 places */
int ni, si;
int q;
/* modifier currently ignored */
/* construct the ascii backwards */
if (i == 0)
{
n[0] = '0';
ni=1;
}
else
for (ni=0,q=(i < 0 ? -i : i); q > 0; q/=10,ni++)
n[ni] = q%10 + '0';
if (i < 0)
{
n[ni] = '-';
ni++;
}
/* pop it off and onto the string */
for (si=0; ni>0; si++,ni--)
s[si] = n[ni-1];
return si;
}
static int po_ftoa(char *s, float f, const char* modifier)
{
char n[20]; /* numbers cannot be bigger than 30 places */
char p[20];
int ni, si, pi;
int q,i,d;
float pp;
/* modifier currently ignored */
/* construct the ascii backwards */
if (f == 0.0)
{
n[0] = '0';
n[1] = '.';
n[2] = '0';
ni=3;
p[0] = '\0';
}
else
{
/* above zero part */
i = (f < 0 ? (int)-f : (int)f);
for (ni=0,q=i; q > 0; q/=10,ni++)
n[ni] = q%10 + '0';
/* point */
p[0] = '.';
/* below zero part */
pp = (f < 0 ? -f : f) - (float)i;
if (pp == 0)
{
p[1] = '0'; pi = 2;
}
else
for (pi=1,pp*=10.0; (pp > 0) && (pi < 4); pp*=10.0,pi++)
{
d = (int)pp;
p[pi] = d + '0';
pp -= d;
}
p[pi] = '\0';
}
/* sign */
if (f < 0)
{
n[ni] = '-';
ni++;
}
/* pop it off and onto the string */
for (si=0; ni>0; si++,ni--)
s[si] = n[ni-1];
for (pi=0; p[pi]; si++,pi++)
s[si] = p[pi];
return si;
}
int cst_vsprintf(char *s, const char *fmt, va_list args)
{
/* A simple sprintf that caters for what flite uses */
int sp=0,fp=0;
char *sa;
char ca;
int ia;
float fa;
for (sp=0,fp=0; fmt[fp]; fp++)
{
if (fmt[fp] == '%')
{
if (fmt[fp+1] == '%')
{
s[sp] = '%';
sp++; fp++;
}
else if (fmt[fp+1] == 's')
{
sa = va_arg(args, char *);
memmove(s+sp,sa,cst_strlen(sa));
sp+=cst_strlen(sa); fp++;
}
else if (fmt[fp+1] == '.')
{
if (fmt[fp+2] == '*')
{ /* When the length is specified on the stack */
ia = va_arg(args, int);
sa = va_arg(args, char *);
memmove(s+sp,sa,ia);
sp+=ia; fp+=3;
}
else
{ /* When the length is specified in the format */
fp+=2; /* skip over the field width */
while ((strchr("0123456789",fmt[fp]) != 0) &&
fmt[fp])
fp++;
sa = va_arg(args, char *);
memmove(s+sp,sa,cst_strlen(sa));
sp+=cst_strlen(sa);
}
}
else if (fmt[fp+1] == 'c')
{
ca = (unsigned char)va_arg(args, unsigned int);
s[sp] = ca;
sp++; fp++;
}
else if (fmt[fp+1] == 'd')
{
ia = va_arg(args, int);
sp += po_itoa(s+sp,ia,"");
fp++;
}
else if (fmt[fp+1] == 'f')
{
fa = (float)va_arg(args, double);
sp += po_ftoa(s+sp,fa,"");
fp++;
}
}
else
{
s[sp] = fmt[fp];
sp++;
}
}
va_end(args);
s[sp] = '\0';
return sp;
}
int cst_fprintf(cst_file fh, char *fmt, ...)
{
va_list args;
char outbuf[512];
int count;
va_start(args,fmt);
count = cst_vsprintf(outbuf,fmt,args);
va_end(args);
return cst_fwrite(fh,outbuf,1,count);
}
int cst_sprintf(char *s, const char *fmt, ...)
{
va_list args;
int count;
va_start(args,fmt);
count = cst_vsprintf(s,fmt,args);
va_end(args);
return count;
}