sam.h - 9base - revived minimalist port of Plan 9 userland to Unix
 (HTM) git clone git://git.suckless.org/9base
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
       sam.h (9617B)
       ---
            1 #include <u.h>
            2 #include <libc.h>
            3 #include <plumb.h>
            4 #include "errors.h"
            5 
            6 #undef waitfor
            7 #define waitfor samwaitfor
            8 
            9 #undef warn
           10 #define warn samwarn
           11 
           12 /*
           13  * BLOCKSIZE is relatively small to keep memory consumption down.
           14  */
           15 
           16 #define        BLOCKSIZE        2048
           17 #define        RUNESIZE        sizeof(Rune)
           18 #define        NDISC                5
           19 #define        NBUFFILES        3+2*NDISC        /* plan 9+undo+snarf+NDISC*(transcript+buf) */
           20 #define NSUBEXP        10
           21 
           22 #define        TRUE                1
           23 #define        FALSE                0
           24 
           25 #undef INFINITY        /* Darwin declares this as HUGE_VAL */
           26 #define        INFINITY        0x7FFFFFFFL
           27 #define        INCR                25
           28 #define        STRSIZE                (2*BLOCKSIZE)
           29 
           30 typedef long                Posn;                /* file position or address */
           31 typedef        ushort                Mod;                /* modification number */
           32 
           33 typedef struct Address        Address;
           34 typedef struct Block        Block;
           35 typedef struct Buffer        Buffer;
           36 typedef struct Disk        Disk;
           37 typedef struct Discdesc        Discdesc;
           38 typedef struct File        File;
           39 typedef struct List        List;
           40 typedef struct Range        Range;
           41 typedef struct Rangeset        Rangeset;
           42 typedef struct String        String;
           43 
           44 enum State
           45 {
           46         Clean =                ' ',
           47         Dirty =                '\'',
           48         Unread =        '-'
           49 };
           50 
           51 struct Range
           52 {
           53         Posn        p1, p2;
           54 };
           55 
           56 struct Rangeset
           57 {
           58         Range        p[NSUBEXP];
           59 };
           60 
           61 struct Address
           62 {
           63         Range        r;
           64         File        *f;
           65 };
           66 
           67 struct String
           68 {
           69         short        n;
           70         short        size;
           71         Rune        *s;
           72 };
           73 
           74 struct List        /* code depends on a long being able to hold a pointer */
           75 {
           76         int        type;        /* 'p' for pointer, 'P' for Posn */
           77         int        nalloc;
           78         int        nused;
           79         union{
           80                 void*        listp;
           81                 void**        voidp;
           82                 Posn*        posnp;
           83                 String**stringp;
           84                 File**        filep;
           85         }g;
           86 };
           87 
           88 #define        listptr                g.listp
           89 #define        voidpptr        g.voidp
           90 #define        posnptr                g.posnp
           91 #define        stringpptr        g.stringp
           92 #define        filepptr        g.filep
           93 
           94 enum
           95 {
           96         Blockincr =        256,
           97         Maxblock =         8*1024,
           98 
           99         BUFSIZE = Maxblock,        /* size from fbufalloc() */
          100         RBUFSIZE = BUFSIZE/sizeof(Rune)
          101 };
          102 
          103 
          104 enum
          105 {
          106         Null                = '-',
          107         Delete                = 'd',
          108         Insert                = 'i',
          109         Filename        = 'f',
          110         Dot                = 'D',
          111         Mark                = 'm'
          112 };
          113 
          114 struct Block
          115 {
          116         uint                addr;        /* disk address in bytes */
          117         union {
          118                 uint        n;        /* number of used runes in block */
          119                 Block        *next;        /* pointer to next in free list */
          120         } u;
          121 };
          122 
          123 struct Disk
          124 {
          125         int                fd;
          126         uint                addr;        /* length of temp file */
          127         Block                *free[Maxblock/Blockincr+1];
          128 };
          129 
          130 Disk*                diskinit(void);
          131 Block*                disknewblock(Disk*, uint);
          132 void                diskrelease(Disk*, Block*);
          133 void                diskread(Disk*, Block*, Rune*, uint);
          134 void                diskwrite(Disk*, Block**, Rune*, uint);
          135 
          136 struct Buffer
          137 {
          138         uint                nc;
          139         Rune                *c;        /* cache */
          140         uint                cnc;        /* bytes in cache */
          141         uint                cmax;        /* size of allocated cache */
          142         uint                cq;        /* position of cache */
          143         int                cdirty;        /* cache needs to be written */
          144         uint                cbi;        /* index of cache Block */
          145         Block                **bl;        /* array of blocks */
          146         uint                nbl;        /* number of blocks */
          147 };
          148 void                bufinsert(Buffer*, uint, Rune*, uint);
          149 void                bufdelete(Buffer*, uint, uint);
          150 uint                bufload(Buffer*, uint, int, int*);
          151 void                bufread(Buffer*, uint, Rune*, uint);
          152 void                bufclose(Buffer*);
          153 void                bufreset(Buffer*);
          154 
          155 struct File
          156 {
          157         Buffer         b;                                /* the data */
          158         Buffer                delta;                /* transcript of changes */
          159         Buffer                epsilon;        /* inversion of delta for redo */
          160         String                name;                /* name of associated file */
          161         uvlong                qidpath;        /* of file when read */
          162         uint                mtime;                /* of file when read */
          163         int                dev;                /* of file when read */
          164         int                unread;                /* file has not been read from disk */
          165 
          166         long                seq;                /* if seq==0, File acts like Buffer */
          167         long                cleanseq;        /* f->seq at last read/write of file */
          168         int                mod;                /* file appears modified in menu */
          169         char                rescuing;        /* sam exiting; this file unusable */
          170 
          171 #if 0
          172 //        Text                *curtext;        /* most recently used associated text */
          173 //        Text                **text;                /* list of associated texts */
          174 //        int                ntext;
          175 //        int                dumpid;                /* used in dumping zeroxed windows */
          176 #endif
          177 
          178         Posn                hiposn;                /* highest address touched this Mod */
          179         Address                dot;                /* current position */
          180         Address                ndot;                /* new current position after update */
          181         Range                tdot;                /* what terminal thinks is current range */
          182         Range                mark;                /* tagged spot in text (don't confuse with Mark) */
          183         List                *rasp;                /* map of what terminal's got */
          184         short                tag;                /* for communicating with terminal */
          185         char                closeok;        /* ok to close file? */
          186         char                deleted;        /* delete at completion of command */
          187         Range                prevdot;        /* state before start of change */
          188         Range                prevmark;
          189         long                prevseq;
          190         int                prevmod;
          191 };
          192 /*File*                fileaddtext(File*, Text*); */
          193 void                fileclose(File*);
          194 void                filedelete(File*, uint, uint);
          195 /*void                filedeltext(File*, Text*); */
          196 void                fileinsert(File*, uint, Rune*, uint);
          197 uint                fileload(File*, uint, int, int*);
          198 void                filemark(File*);
          199 void                filereset(File*);
          200 void                filesetname(File*, String*);
          201 void                fileundelete(File*, Buffer*, uint, uint);
          202 void                fileuninsert(File*, Buffer*, uint, uint);
          203 void                fileunsetname(File*, Buffer*);
          204 void                fileundo(File*, int, int, uint*, uint*, int);
          205 int                fileupdate(File*, int, int);
          206 
          207 int                filereadc(File*, uint);
          208 File                *fileopen(void);
          209 void                loginsert(File*, uint, Rune*, uint);
          210 void                logdelete(File*, uint, uint);
          211 void                logsetname(File*, String*);
          212 int                fileisdirty(File*);
          213 long                undoseq(File*, int);
          214 long                prevseq(Buffer*);
          215 
          216 void                raspload(File*);
          217 void                raspstart(File*);
          218 void                raspdelete(File*, uint, uint, int);
          219 void                raspinsert(File*, uint, Rune*, uint, int);
          220 void                raspdone(File*, int);
          221 void                raspflush(File*);
          222 
          223 /*
          224  * acme fns
          225  */
          226 void*        fbufalloc(void);
          227 void        fbuffree(void*);
          228 uint        min(uint, uint);
          229 void        cvttorunes(char*, int, Rune*, int*, int*, int*);
          230 
          231 #define        runemalloc(a)                (Rune*)emalloc((a)*sizeof(Rune))
          232 #define        runerealloc(a, b)        (Rune*)realloc((a), (b)*sizeof(Rune))
          233 #define        runemove(a, b, c)        memmove((a), (b), (c)*sizeof(Rune))
          234 
          235 int        alnum(int);
          236 int        Read(int, void*, int);
          237 void        Seek(int, long, int);
          238 int        plan9(File*, int, String*, int);
          239 int        Write(int, void*, int);
          240 int        bexecute(File*, Posn);
          241 void        cd(String*);
          242 void        closefiles(File*, String*);
          243 void        closeio(Posn);
          244 void        cmdloop(void);
          245 void        cmdupdate(void);
          246 void        compile(String*);
          247 void        copy(File*, Address);
          248 File        *current(File*);
          249 void        delete(File*);
          250 void        delfile(File*);
          251 void        dellist(List*, int);
          252 void        doubleclick(File*, Posn);
          253 void        dprint(char*, ...);
          254 void        edit(File*, int);
          255 void        *emalloc(ulong);
          256 void        *erealloc(void*, ulong);
          257 void        error(Err);
          258 void        error_c(Err, int);
          259 void        error_r(Err, char*);
          260 void        error_s(Err, char*);
          261 int        execute(File*, Posn, Posn);
          262 int        filematch(File*, String*);
          263 void        filename(File*);
          264 void        fixname(String*);
          265 void        fullname(String*);
          266 void        getcurwd(void);
          267 File        *getfile(String*);
          268 int        getname(File*, String*, int);
          269 long        getnum(int);
          270 void        hiccough(char*);
          271 void        inslist(List*, int, ...);
          272 Address        lineaddr(Posn, Address, int);
          273 List        *listalloc(int);
          274 void        listfree(List*);
          275 void        load(File*);
          276 File        *lookfile(String*);
          277 void        lookorigin(File*, Posn, Posn);
          278 int        lookup(int);
          279 void        move(File*, Address);
          280 void        moveto(File*, Range);
          281 File        *newfile(void);
          282 void        nextmatch(File*, String*, Posn, int);
          283 int        newtmp(int);
          284 void        notifyf(void*, char*);
          285 void        panic(char*);
          286 void        printposn(File*, int);
          287 void        print_ss(char*, String*, String*);
          288 void        print_s(char*, String*);
          289 int        rcv(void);
          290 Range        rdata(List*, Posn, Posn);
          291 Posn        readio(File*, int*, int, int);
          292 void        rescue(void);
          293 void        resetcmd(void);
          294 void        resetsys(void);
          295 void        resetxec(void);
          296 void        rgrow(List*, Posn, Posn);
          297 void        samerr(char*);
          298 void        settempfile(void);
          299 int        skipbl(void);
          300 void        snarf(File*, Posn, Posn, Buffer*, int);
          301 void        sortname(File*);
          302 void        startup(char*, int, char**, char**);
          303 void        state(File*, int);
          304 int        statfd(int, ulong*, uvlong*, long*, long*, long*);
          305 int        statfile(char*, ulong*, uvlong*, long*, long*, long*);
          306 void        Straddc(String*, int);
          307 void        Strclose(String*);
          308 int        Strcmp(String*, String*);
          309 void        Strdelete(String*, Posn, Posn);
          310 void        Strdupl(String*, Rune*);
          311 void        Strduplstr(String*, String*);
          312 void        Strinit(String*);
          313 void        Strinit0(String*);
          314 void        Strinsert(String*, String*, Posn);
          315 void        Strinsure(String*, ulong);
          316 int        Strispre(String*, String*);
          317 void        Strzero(String*);
          318 int        Strlen(Rune*);
          319 char        *Strtoc(String*);
          320 void        syserror(char*);
          321 void        telldot(File*);
          322 void        tellpat(void);
          323 String        *tmpcstr(char*);
          324 String        *tmprstr(Rune*, int);
          325 void        freetmpstr(String*);
          326 void        termcommand(void);
          327 void        termwrite(char*);
          328 File        *tofile(String*);
          329 void        trytoclose(File*);
          330 void        trytoquit(void);
          331 int        undo(int);
          332 void        update(void);
          333 int        waitfor(int);
          334 void        warn(Warn);
          335 void        warn_s(Warn, char*);
          336 void        warn_SS(Warn, String*, String*);
          337 void        warn_S(Warn, String*);
          338 int        whichmenu(File*);
          339 void        writef(File*);
          340 Posn        writeio(File*);
          341 Discdesc *Dstart(void);
          342 
          343 extern Rune        samname[];        /* compiler dependent */
          344 extern Rune        *left[];
          345 extern Rune        *right[];
          346 
          347 extern char        RSAM[];                /* system dependent */
          348 extern char        SAMTERM[];
          349 extern char        HOME[];
          350 extern char        TMPDIR[];
          351 extern char        SH[];
          352 extern char        SHPATH[];
          353 extern char        RX[];
          354 extern char        RXPATH[];
          355 
          356 /*
          357  * acme globals
          358  */
          359 extern long                seq;
          360 extern Disk                *disk;
          361 
          362 extern char        *rsamname;        /* globals */
          363 extern char        *samterm;
          364 extern Rune        genbuf[];
          365 extern char        *genc;
          366 extern int        io;
          367 extern int        patset;
          368 extern int        quitok;
          369 extern Address        addr;
          370 extern Buffer        snarfbuf;
          371 extern Buffer        plan9buf;
          372 extern List        file;
          373 extern List        tempfile;
          374 extern File        *cmd;
          375 extern File        *curfile;
          376 extern File        *lastfile;
          377 extern Mod        modnum;
          378 extern Posn        cmdpt;
          379 extern Posn        cmdptadv;
          380 extern Rangeset        sel;
          381 extern String        curwd;
          382 extern String        cmdstr;
          383 extern String        genstr;
          384 extern String        lastpat;
          385 extern String        lastregexp;
          386 extern String        plan9cmd;
          387 extern int        downloaded;
          388 extern int        eof;
          389 extern int        bpipeok;
          390 extern int        panicking;
          391 extern Rune        empty[];
          392 extern int        termlocked;
          393 extern int        outbuffered;
          394 
          395 #include "mesg.h"
          396 
          397 void        outTs(Hmesg, int);
          398 void        outT0(Hmesg);
          399 void        outTl(Hmesg, long);
          400 void        outTslS(Hmesg, int, long, String*);
          401 void        outTS(Hmesg, String*);
          402 void        outTsS(Hmesg, int, String*);
          403 void        outTsllS(Hmesg, int, long, long, String*);
          404 void        outTsll(Hmesg, int, long, long);
          405 void        outTsl(Hmesg, int, long);
          406 void        outTsv(Hmesg, int, vlong);
          407 void        outflush(void);
          408 int needoutflush(void);