123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416 |
- /*
- * This file is part of the UCB release of Plan 9. It is subject to the license
- * terms in the LICENSE file found in the top-level directory of this
- * distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No
- * part of the UCB release of Plan 9, including this file, may be copied,
- * modified, propagated, or distributed except according to the terms contained
- * in the LICENSE file.
- */
- #include <u.h>
- #include <libc.h>
- #include <plumb.h>
- #include "errors.h"
- /*
- * BLOCKSIZE is relatively small to keep memory consumption down.
- */
- #define BLOCKSIZE 2048
- #define RUNESIZE sizeof(Rune)
- #define NDISC 5
- #define NBUFFILES 3+2*NDISC /* plan 9+undo+snarf+NDISC*(transcript+buf) */
- #define NSUBEXP 10
- #define TRUE 1
- #define FALSE 0
- #define INFINITY 0x7FFFFFFFL
- #define INCR 25
- #define STRSIZE (2*BLOCKSIZE)
- // Plan9 types
- typedef unsigned char uchar;
- typedef unsigned short ushort;
- typedef uint64_t uvlong;
- typedef uint32_t ulong;
- typedef int64_t vlong;
- typedef long Posn; /* file position or address */
- typedef ushort Mod; /* modification number */
- typedef struct Address Address;
- typedef struct Block Block;
- typedef struct Buffer Buffer;
- typedef struct Disk Disk;
- typedef struct Discdesc Discdesc;
- typedef struct File File;
- typedef struct List List;
- typedef struct Range Range;
- typedef struct Rangeset Rangeset;
- typedef struct String String;
- enum State
- {
- Clean = ' ',
- Dirty = '\'',
- Unread = '-',
- };
- struct Range
- {
- Posn p1, p2;
- };
- struct Rangeset
- {
- Range p[NSUBEXP];
- };
- struct Address
- {
- Range r;
- File *f;
- };
- struct String
- {
- short n;
- short size;
- Rune *s;
- };
- struct List
- {
- int type; /* 'p' for pointer, 'P' for Posn */
- int nalloc;
- int nused;
- union{
- void* listp;
- void** voidp;
- Posn* posnp;
- String**stringp;
- File** filep;
- }g;
- };
- #define listptr g.listp
- #define voidpptr g.voidp
- #define posnptr g.posnp
- #define stringpptr g.stringp
- #define filepptr g.filep
- enum
- {
- Blockincr = 256,
- Maxblock = 8*1024,
- BUFSIZE = Maxblock, /* size from fbufalloc() */
- RBUFSIZE = BUFSIZE/sizeof(Rune),
- };
- enum
- {
- Null = '-',
- Delete = 'd',
- Insert = 'i',
- Filename = 'f',
- Dot = 'D',
- Mark = 'm',
- };
- struct Block
- {
- uint addr; /* disk address in bytes */
- union
- {
- uint n; /* number of used runes in block */
- Block *next; /* pointer to next in free list */
- };
- };
- struct Disk
- {
- int fd;
- uint addr; /* length of temp file */
- Block *free[Maxblock/Blockincr+1];
- };
- Disk* diskinit(void);
- Block* disknewblock(Disk*, uint);
- void diskrelease(Disk*, Block*);
- void diskread(Disk*, Block*, Rune*, uint);
- void diskwrite(Disk*, Block**, Rune*, uint);
- struct Buffer
- {
- uint nc;
- Rune *c; /* cache */
- uint cnc; /* bytes in cache */
- uint cmax; /* size of allocated cache */
- uint cq; /* position of cache */
- int cdirty; /* cache needs to be written */
- uint cbi; /* index of cache Block */
- Block **bl; /* array of blocks */
- uint nbl; /* number of blocks */
- };
- void bufinsert(Buffer*, uint, Rune*, uint);
- void bufdelete(Buffer*, uint, uint);
- uint bufload(Buffer*, uint, int, int*);
- void bufread(Buffer*, uint, Rune*, uint);
- void bufclose(Buffer*);
- void bufreset(Buffer*);
- struct File
- {
- Buffer; /* the data */
- Buffer delta; /* transcript of changes */
- Buffer epsilon; /* inversion of delta for redo */
- String name; /* name of associated file */
- uvlong qidpath; /* of file when read */
- uint mtime; /* of file when read */
- int dev; /* of file when read */
- int unread; /* file has not been read from disk */
- long seq; /* if seq==0, File acts like Buffer */
- long cleanseq; /* f->seq at last read/write of file */
- int mod; /* file appears modified in menu */
- char rescuing; /* sam exiting; this file unusable */
- // Text *curtext; /* most recently used associated text */
- // Text **text; /* list of associated texts */
- // int ntext;
- // int dumpid; /* used in dumping zeroxed windows */
- Posn hiposn; /* highest address touched this Mod */
- Address dot; /* current position */
- Address ndot; /* new current position after update */
- Range tdot; /* what terminal thinks is current range */
- Range mark; /* tagged spot in text (don't confuse with Mark) */
- List *rasp; /* map of what terminal's got */
- short tag; /* for communicating with terminal */
- char closeok; /* ok to close file? */
- char deleted; /* delete at completion of command */
- Range prevdot; /* state before start of change */
- Range prevmark;
- long prevseq;
- int prevmod;
- };
- //File* fileaddtext(File*, Text*);
- void fileclose(File*);
- void filedelete(File*, uint, uint);
- //void filedeltext(File*, Text*);
- void fileinsert(File*, uint, Rune*, uint);
- uint fileload(File*, uint, int, int*);
- void filemark(File*);
- void filereset(File*);
- void filesetname(File*, String*);
- void fileundelete(File*, Buffer*, uint, uint);
- void fileuninsert(File*, Buffer*, uint, uint);
- void fileunsetname(File*, Buffer*);
- void fileundo(File*, int, int, uint*, uint*, int);
- int fileupdate(File*, int, int);
- int filereadc(File*, uint);
- File *fileopen(void);
- void loginsert(File*, uint, Rune*, uint);
- void logdelete(File*, uint, uint);
- void logsetname(File*, String*);
- int fileisdirty(File*);
- long undoseq(File*, int);
- long prevseq(Buffer*);
- void raspload(File*);
- void raspstart(File*);
- void raspdelete(File*, uint, uint, int);
- void raspinsert(File*, uint, Rune*, uint, int);
- void raspdone(File*, int);
- void raspflush(File*);
- /*
- * acme fns
- */
- void* fbufalloc(void);
- void fbuffree(void*);
- uint min(uint, uint);
- void cvttorunes(char*, int, Rune*, int*, int*, int*);
- #define runemalloc(a) (Rune*)emalloc((a)*sizeof(Rune))
- #define runerealloc(a, b) (Rune*)realloc((a), (b)*sizeof(Rune))
- #define runemove(a, b, c) memmove((a), (b), (c)*sizeof(Rune))
- int alnum(int);
- int Read(int, void*, int);
- void Seek(int, long, int);
- int plan9(File*, int, String*, int);
- int Write(int, void*, int);
- int bexecute(File*, Posn);
- void cd(String*);
- void closefiles(File*, String*);
- void closeio(Posn);
- void cmdloop(void);
- void cmdupdate(void);
- void compile(String*);
- void copy(File*, Address);
- File *current(File*);
- void delete(File*);
- void delfile(File*);
- void dellist(List*, int);
- void doubleclick(File*, Posn);
- void dprint(char*, ...);
- void edit(File*, int);
- void *emalloc(ulong);
- void *erealloc(void*, ulong);
- void error(Err);
- void error_c(Err, int);
- void error_r(Err, char*);
- void error_s(Err, char*);
- int execute(File*, Posn, Posn);
- int filematch(File*, String*);
- void filename(File*);
- void fixname(String*);
- void fullname(String*);
- void getcurwd(void);
- File *getfile(String*);
- int getname(File*, String*, int);
- long getnum(int);
- void hiccough(char*);
- void inslist(List*, int, ...);
- Address lineaddr(Posn, Address, int);
- List *listalloc(int);
- void listfree(List*);
- void load(File*);
- File *lookfile(String*);
- void lookorigin(File*, Posn, Posn);
- int lookup(int);
- void move(File*, Address);
- void moveto(File*, Range);
- File *newfile(void);
- void nextmatch(File*, String*, Posn, int);
- void notifyf(void*, char*);
- void panic(char*);
- void printposn(File*, int);
- void print_ss(char*, String*, String*);
- void print_s(char*, String*);
- int rcv(void);
- Range rdata(List*, Posn, Posn);
- Posn readio(File*, int*, int, int);
- void rescue(void);
- void resetcmd(void);
- void resetsys(void);
- void resetxec(void);
- void rgrow(List*, Posn, Posn);
- void samerr(char*);
- void settempfile(void);
- int skipbl(void);
- void snarf(File*, Posn, Posn, Buffer*, int);
- void sortname(File*);
- void startup(char*, int, char**, char**);
- void state(File*, int);
- int statfd(int, ulong*, uvlong*, long*, long*, long*);
- int statfile(char*, ulong*, uvlong*, long*, long*, long*);
- void Straddc(String*, int);
- void Strclose(String*);
- int Strcmp(String*, String*);
- void Strdelete(String*, Posn, Posn);
- void Strdupl(String*, Rune*);
- void Strduplstr(String*, String*);
- void Strinit(String*);
- void Strinit0(String*);
- void Strinsert(String*, String*, Posn);
- void Strinsure(String*, ulong);
- int Strispre(String*, String*);
- void Strzero(String*);
- int Strlen(Rune*);
- char *Strtoc(String*);
- void syserror(char*);
- void telldot(File*);
- void tellpat(void);
- String *tmpcstr(char*);
- String *tmprstr(Rune*, int);
- void freetmpstr(String*);
- void termcommand(void);
- void termwrite(char*);
- File *tofile(String*);
- void trytoclose(File*);
- void trytoquit(void);
- int undo(int);
- void update(void);
- char *waitfor(int);
- void warn(Warn);
- void warn_s(Warn, char*);
- void warn_SS(Warn, String*, String*);
- void warn_S(Warn, String*);
- int whichmenu(File*);
- void writef(File*);
- Posn writeio(File*);
- Discdesc *Dstart(void);
- extern Rune *samname; /* compiler dependent */
- extern Rune *left[];
- extern Rune *right[];
- extern char RSAM[]; /* system dependent */
- extern char SAMTERM[];
- extern char HOME[];
- extern char TMPDIR[];
- extern char SH[];
- extern char SHPATH[];
- extern char RX[];
- extern char RXPATH[];
- extern char SAMSAVECMD[];
- /*
- * acme globals
- */
- extern long seq;
- extern Disk *disk;
- extern char *rsamname; /* globals */
- extern char *samterm;
- extern Rune genbuf[];
- extern char *genc;
- extern int io;
- extern int patset;
- extern int quitok;
- extern Address addr;
- extern Buffer snarfbuf;
- extern Buffer plan9buf;
- extern List file;
- extern List tempfile;
- extern File *cmd;
- extern File *curfile;
- extern File *lastfile;
- extern Mod modnum;
- extern Posn cmdpt;
- extern Posn cmdptadv;
- extern Rangeset sel;
- extern String curwd;
- extern String cmdstr;
- extern String genstr;
- extern String lastpat;
- extern String lastregexp;
- extern String plan9cmd;
- extern int downloaded;
- extern int eof;
- extern int bpipeok;
- extern int panicking;
- extern Rune empty[];
- extern int termlocked;
- extern int outbuffered;
- #include "mesg.h"
- void outTs(Hmesg, int);
- void outT0(Hmesg);
- void outTl(Hmesg, long);
- void outTslS(Hmesg, int, long, String*);
- void outTS(Hmesg, String*);
- void outTsS(Hmesg, int, String*);
- void outTsllS(Hmesg, int, long, long, String*);
- void outTsll(Hmesg, int, long, long);
- void outTsl(Hmesg, int, long);
- void outTsv(Hmesg, int, vlong);
- void outflush(void);
- int needoutflush(void);
|