📄 vtread.c
字号:
#include "stdinc.h"#include <bio.h>typedef struct Source Source;struct Source{ ulong gen; int psize; int dsize; int dir; int active; int depth; uvlong size; uchar score[VtScoreSize]; int reserved;};int bsize;Biobuf *bout;int ver;int cmp;int all;int find;uchar fscore[VtScoreSize];int dirSize;void (*parse)(Source*, uchar*);VtSession *z;int vtGetUint16(uchar *p);ulong vtGetUint32(uchar *p);uvlong vtGetUint48(uchar *p);void usage(void);int parseScore(uchar *score, char *buf, int n);void parse1(Source*, uchar*);void parse2(Source*, uchar*);int dumpDir(Source*, int indent);voidmain(int argc, char *argv[]){ char *host = nil; uchar score[VtScoreSize]; uchar buf[VtMaxLumpSize]; int type; int n; type = VtDataType; ARGBEGIN{ case 't': type = atoi(ARGF()); break; default: usage(); break; }ARGEND vtAttach(); bout = vtMemAllocZ(sizeof(Biobuf)); Binit(bout, 1, OWRITE); if(argc != 1) usage(); vtAttach(); fmtinstall('V', vtScoreFmt); fmtinstall('R', vtErrFmt); z = vtDial(host, 0); if(z == nil) vtFatal("could not connect to server: %s", vtGetError()); if(!vtConnect(z, 0)) sysfatal("vtConnect: %r"); if(!parseScore(score, argv[0], strlen(argv[0]))) vtFatal("could not parse score: %s", vtGetError()); n = vtRead(z, score, type, buf, VtMaxLumpSize); if(n < 0) vtFatal("could not read block: %s", vtGetError()); Bwrite(bout, buf, n); Bterm(bout); vtClose(z); vtDetach(); exits(0);}voidusage(void){ fprint(2, "%s: [-t type] score\n", argv0); exits("usage");}intparseScore(uchar *score, char *buf, int n){ int i, c; memset(score, 0, VtScoreSize); if(n < VtScoreSize*2) return 0; for(i=0; i<VtScoreSize*2; i++) { if(buf[i] >= '0' && buf[i] <= '9') c = buf[i] - '0'; else if(buf[i] >= 'a' && buf[i] <= 'f') c = buf[i] - 'a' + 10; else if(buf[i] >= 'A' && buf[i] <= 'F') c = buf[i] - 'A' + 10; else { return 0; } if((i & 1) == 0) c <<= 4; score[i>>1] |= c; } return 1;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -