読者です 読者をやめる 読者になる 読者になる

by shigemk2

当面は技術的なことしか書かない

lpwrite #firstv6

Unix

lpwrite

印字する。

lpwrite()
{
    register int c;

    while ((c=cpass())>=0)
        lpcanon(c);
}

cpass

1バイトずつシステムコールで渡されたデータを取ってくる。

u_baseがバッファのアドレス

/*
 * Pick up and return the next character from the user's
 * write call at location u_base;
 * update u_base, u_count, and u_offset.  Return -1
 * when u_count is exhausted.  u_base is in the user's
 * address space unless u_segflg is set.
 */
cpass()
{
    register c;

    if(u.u_count == 0)
        return(-1);
    if(u.u_segflg)
        c = *u.u_base; else
        if((c=fubyte(u.u_base)) < 0) {
            u.u_error = EFAULT;
            return(-1);
        }
    u.u_count--;
    if(++u.u_offset[1] == 0)
        u.u_offset[0]++;
    u.u_base++;
    return(c&0377);
}

elseの書き方が変。

アドレスだがsegflgを見ないと分からない。

cpass()
{
    register c;

    if(u.u_count == 0)
        return(-1);
    if(u.u_segflg)
        c = *u.u_base;
    } else if((c=fubyte(u.u_base)) < 0) {
            u.u_error = EFAULT;
            return(-1);
        }
    u.u_count--;
    if(++u.u_offset[1] == 0)
        u.u_offset[0]++;
    u.u_base++;
    return(c&0377);
}