Subversion Repositories planix.SVN

Rev

Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

#include <u.h>
#include <libc.h>
#include <draw.h>
#include <thread.h>
#include <cursor.h>
#include <mouse.h>
#include <keyboard.h>
#include <frame.h>
#include <fcall.h>
#include "dat.h"
#include "fns.h"

void
cvttorunes(char *p, int n, Rune *r, int *nb, int *nr, int *nulls)
{
        uchar *q;
        Rune *s;
        int j, w;

        /*
         * Always guaranteed that n bytes may be interpreted
         * without worrying about partial runes.  This may mean
         * reading up to UTFmax-1 more bytes than n; the caller
         * knows this.  If n is a firm limit, the caller should
         * set p[n] = 0.
         */
        q = (uchar*)p;
        s = r;
        for(j=0; j<n; j+=w){
                if(*q < Runeself){
                        w = 1;
                        *s = *q++;
                }else{
                        w = chartorune(s, (char*)q);
                        q += w;
                }
                if(*s)
                        s++;
                else if(nulls)
                                *nulls = TRUE;
        }
        *nb = (char*)q-p;
        *nr = s-r;
}

void
error(char *s)
{
        fprint(2, "rio: %s: %r\n", s);
        if(errorshouldabort)
                abort();
        threadexitsall("error");
}

void*
erealloc(void *p, uint n)
{
        p = realloc(p, n);
        if(p == nil)
                error("realloc failed");
        return p;
}

void*
emalloc(uint n)
{
        void *p;

        p = malloc(n);
        if(p == nil)
                error("malloc failed");
        memset(p, 0, n);
        return p;
}

char*
estrdup(char *s)
{
        char *p;

        p = malloc(strlen(s)+1);
        if(p == nil)
                error("strdup failed");
        strcpy(p, s);
        return p;
}

int
isalnum(Rune c)
{
        /*
         * Hard to get absolutely right.  Use what we know about ASCII
         * and assume anything above the Latin control characters is
         * potentially an alphanumeric.
         */
        if(c <= ' ')
                return FALSE;
        if(0x7F<=c && c<=0xA0)
                return FALSE;
        if(utfrune("!\"#$%&'()*+,-./:;<=>?@[\\]^`{|}~", c))
                return FALSE;
        return TRUE;
}

Rune*
strrune(Rune *s, Rune c)
{
        Rune c1;

        if(c == 0) {
                while(*s++)
                        ;
                return s-1;
        }

        while(c1 = *s++)
                if(c1 == c)
                        return s-1;
        return nil;
}

int
min(int a, int b)
{
        if(a < b)
                return a;
        return b;
}

int
max(int a, int b)
{
        if(a > b)
                return a;
        return b;
}

char*
runetobyte(Rune *r, int n, int *ip)
{
        char *s;
        int m;

        s = emalloc(n*UTFmax+1);
        m = snprint(s, n*UTFmax+1, "%.*S", n, r);
        *ip = m;
        return s;
}