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