The ARSS

Main Page | Download | Code | Examples | Documentation | MFAQ | Roadmap
C:\msys\home\arss\clean code for 0.2d2\gpl.c.html
/* The Analysis & Resynthesis Sound Spectrograph
Copyright (C) 2005-2008 Michel Rouzic

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., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.*/
C:\msys\home\arss\util.c.html
#include "util.h"

void win_return()
{
        #ifdef WIN32
        if (quiet==0)
        {
                printf("Press Return to quit\n");
                getchar();
        }
        #endif
}

#ifdef WIN32
#include "Windows.h"

int32_t gettime()       // in milliseconds
{
        return (int32_t) GetTickCount();
}
#else
#include <sys/time.h>

int32_t gettime()       // in milliseconds
{
        struct timeval t;

        gettimeofday(&t, NULL);

        return (int32_t) t.tv_sec*1000 + t.tv_usec/1000;
}
#endif

inline double roundoff(double x)        // nearbyint() replacement, with the exception that the result contains a non-zero fractional part
{
        if (x>0)
                return x + 0.5;
        else
                return x - 0.5;
}

inline int32_t roundup(double x)
{
        if (fmod(x, 1.0) == 0)
                return (int32_t) x;
        else
                return (int32_t) x + 1;
}

float getfloat()
{
        float x;
        char a[32];
        fgets(a, 31, stdin);
        if (a[0]==0)
                return 0.0;
        else
        {
                x=atof(a);
                return x;
        }
}

inline int32_t smallprimes(int32_t x)   // returns 1 if x is only made of these small primes
{
        int32_t i, p[2]={2, 3};

        for (i=0; i<2; i++)
                while (x%p[i] == 0)
                        x/=p[i];

        return x;
}

inline int32_t nextsprime(int32_t x)    // returns the next integer only made of small primes
{
        while (smallprimes(x)!=1)
                x++;

        return x;
}

inline double log_b(double x)
{
        if (LOGBASE==1.0)
                return x;
        else
                #ifdef DEBUG
                if (x==0)
                        fprintf(stderr, "Warning : log(0) returning -infinite\n");
                else
                #endif
                return log(x)/log(LOGBASE);
}

inline uint32_t rand_u32()
{
        #if RAND_MAX == 2147483647
                return rand();
        #elif RAND_MAX == 32767
                return ((rand()%256)<<24) | ((rand()%256)<<16) | ((rand()%256)<<8) | (rand()%256);
        #else
                fprintf(stderr, "Unhandled RAND_MAX value : %d\nPlease signal this error to the developer.", RAND_MAX);
                return rand();
        #endif
}

inline double dblrand() // range is +/- 1.0
{
        return ((double) rand_u32() * (1.0 / 2147483648.0)) - 1.0;
}

inline uint16_t fread_le_short(FILE *file)              // read from file a 16-bit integer in little endian
{
        uint8_t        byte_a, byte_b;

        fread(&byte_a, 1, 1, file);
        fread(&byte_b, 1, 1, file);

        return (uint16_t) (byte_b<<8) | byte_a;
}

inline uint32_t fread_le_word(FILE *file)               // read from file a 32-bit integer in little endian
{
        uint8_t        byte_a, byte_b, byte_c, byte_d;

        fread(&byte_a, 1, 1, file);
        fread(&byte_b, 1, 1, file);
        fread(&byte_c, 1, 1, file);
        fread(&byte_d, 1, 1, file);

        return (uint32_t) (byte_d<<24) | (byte_c<<16) | (byte_b<<8) | byte_a;
}

inline void fwrite_le_short(uint16_t s, FILE *file)     // write to file a 16-bit integer in little endian
{
        uint8_t byte;

        byte = s & 0xFF;
        fwrite(&byte, 1, 1, file);
        byte = (s>>8) & 0xFF;
        fwrite(&byte, 1, 1, file);
}

inline void fwrite_le_word(uint32_t w, FILE *file)      // write to file a 32-bit integer in little endian
{
        uint8_t byte;

        byte = w & 0xFF;
        fwrite(&byte, 1, 1, file);
        byte = (w>>8) & 0xFF;
        fwrite(&byte, 1, 1, file);
        byte = (w>>16) & 0xFF;
        fwrite(&byte, 1, 1, file);
        byte = (w>>24) & 0xFF;
        fwrite(&byte, 1, 1, file);
}

char *getstring()
{
        signed long len_str, i;
        char a[FILENAME_MAX], *b;

        fgets(a, sizeof(a), stdin);
        len_str=strlen(a);

        b=malloc(len_str * sizeof(char));

        for (i=0; i<len_str; i++)
                b[i]=a[i];

        b[len_str-1]=0;

        return b;
}

int32_t str_isnumber(char *string)      // returns 1 is string is a valid float number, 0 otherwise
{
        int32_t i;
        int32_t size = strlen(string);
        char c;

        if (size==0)
                return 0;

        c = string[0];
        if (! ((c>='0' && c<='9') || c=='+' || c=='-'))
                return 0;

        for (i=1; i<size; i++)
        {
                c = string[i];

                if (! ((c>='0' && c<='9') || c=='.' || c=='e'))
                        return 0;
        }

        return 1;
}


This site is in hiatus. Last updated on February 23rd, 2009
©2007-2009 Michel Rouzic