mirror of
https://github.com/9fans/plan9port.git
synced 2025-01-15 11:20:03 +00:00
f7012583e9
Silence a few more warnings. Strip down the mkfiles more. Fix bug in X11 mouse handling, note groups.
407 lines
9.4 KiB
C
407 lines
9.4 KiB
C
#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
|
|
|
|
#undef INFINITY /* Darwin declares this as HUGE_VAL */
|
|
#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 /* code depends on a long being able to hold a pointer */
|
|
{
|
|
int nalloc;
|
|
int nused;
|
|
union{
|
|
void *listp;
|
|
Block *blkp;
|
|
long *longp;
|
|
uchar* *ucharp;
|
|
String* *stringp;
|
|
File* *filep;
|
|
long listv;
|
|
}g;
|
|
};
|
|
|
|
#define listptr g.listp
|
|
#define blkptr g.blkp
|
|
#define longptr g.longp
|
|
#define ucharpptr g.ucharp
|
|
#define stringpptr g.stringp
|
|
#define filepptr g.filep
|
|
#define listval g.listv
|
|
|
|
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 */
|
|
} u;
|
|
};
|
|
|
|
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 b; /* 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, long);
|
|
Address lineaddr(Posn, Address, 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);
|
|
int newtmp(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);
|
|
int 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[];
|
|
|
|
/*
|
|
* 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, long);
|
|
void outstart(Hmesg);
|
|
void outcopy(int, void*);
|
|
void outshort(int);
|
|
void outlong(long);
|
|
void outvlong(void*);
|
|
void outsend(void);
|
|
void outflush(void);
|
|
|