📄 sam.h
字号:
#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)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.filepenum{ 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);/* * 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 noflush;#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);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -