|
|
1.1 root 1: #include <stddef.h>
2: #include <stdio.h>
3: #include <string.h>
4: #include "scsi.h"
5: #include "scsish.h"
6: #include "tcl.h"
7: #include "generic/fns.h"
8:
9: extern Device genericdev;
10: static Device *dev = 0;
11: static void parse(FILE *);
12: Tcl_Interp *interp;
13:
14: main()
15: {
16: interp = Tcl_CreateInterp();
17: scsi_target(2);
18: setdevice(&genericdev);
19: set_sony();
20: printf("dev=%s, target=%d:\n", dev->name, s_id);
21: parse(stdin);
22: exit(0);
23: }
24:
25: static void
26: parse(FILE *fp)
27: {
28: char line[1000], *cmd;
29: int result, partial;
30: static Tcl_CmdBuf buffer;
31:
32: buffer = Tcl_CreateCmdBuf();
33: partial = 0;
34: for(;;){
35: clearerr(fp);
36: if(!partial){
37: fputs("% ", stdout);
38: fflush(stdout);
39: }
40: if(fgets(line, sizeof line, fp) == NULL){
41: if(!partial)
42: exit(0);
43: line[0] = 0;
44: }
45: cmd = Tcl_AssembleCmd(buffer, line);
46: if(cmd == NULL){
47: partial = 1;
48: continue;
49: }
50: partial = 0;
51: result = Tcl_RecordAndEval(interp, cmd, 0);
52: if(result == TCL_OK){
53: if(interp->result[0])
54: printf("%s\n", interp->result);
55: } else {
56: if(result == TCL_ERROR)
57: printf("Error");
58: else
59: printf("Error %d", result);
60: if(interp->result)
61: printf(": %s", interp->result);
62: printf("\n");
63: }
64: }
65: }
66:
67: static Function *
68: flook(Function *f, char *name)
69: {
70: for(; f->help; f++)
71: if(strncmp(f->name, name, strlen(f->name)) == 0)
72: return(f);
73: return(0);
74: }
75:
76: void
77: setdevice(Device *d)
78: {
79: Function *f;
80: static char errbuf[256];
81:
82: dev = d;
83: ss_extsense = dev->extsense;
84: for(f = d->fns; f->name; f++){
85: Tcl_CreateCommand(interp, f->name, f->fn, (ClientData)errbuf, NULL);
86: }
87: }
88:
89: static
90: help(Device *d, char *cmd, Device *prec)
91: {
92: Function *f;
93: Function *base;
94:
95: base = (prec && prec->fns)? prec->fns:0;
96: if(cmd == 0){
97: printf("device %s(%s):\n", d->name, d->verbose);
98: if(f = d->fns)
99: while(f->name){
100: if((base == 0) || (flook(base, f->name) == 0))
101: printf("\t%s\n", f->help);
102: f++;
103: }
104: return(0);
105: } else {
106: if(f = d->fns)
107: while(f->name)
108: if(strcmp(f->name, cmd) == 0){
109: printf("(%s) %s\n", d->name, f->help);
110: return(1);
111: } else
112: f++;
113: return(0);
114: }
115: }
116:
117: int
118: gen_help(ClientData err, Tcl_Interp *it, int argc, char **argv)
119: {
120: #pragma ref it
121: #pragma ref err
122:
123: if(dev)
124: if(help(dev, argc <= 1? 0:argv[1], (Device *)0))
125: return(0);
126: help(&genericdev, argc <= 1? 0:argv[1], dev);
127: return(TCL_OK);
128: }
129:
130: extern Device sonydev;
131: extern Device wrendev;
132: static Device *devs[] = {
133: &genericdev,
134: &sonydev,
135: &wrendev,
136: 0
137: };
138:
139: int
140: gen_dev(ClientData err, Tcl_Interp *it, int argc, char **argv)
141: {
142: Device **d;
143:
144: #pragma ref it
145: #pragma ref err
146:
147: if(argc == 1)
148: printf("dev=%s\n", dev? dev->name : genericdev.name);
149: else if(strcmp(argv[1], "?") == 0){
150: printf("available devices:\n");
151: for(d = devs; *d; d++)
152: printf("\t%s(%s)\n", (*d)->name, (*d)->verbose);
153: } else {
154: for(d = devs; *d; d++)
155: if(strcmp(argv[1], (*d)->name) == 0)
156: break;
157: if(*d){
158: setdevice(&genericdev);
159: setdevice(*d);
160: } else
161: fprintf(stderr, "device '%s' unknown\n", argv[1]);
162: }
163: return(TCL_OK);
164: }
165:
166: void
167: scsi_target(int n)
168: {
169: if((n < 0) || (n >= 8))
170: fprintf(stderr, "%d is an invalid target\n", n);
171: else
172: s_id = n;
173: }
174:
175: set_sony()
176: {
177: char *a[3];
178:
179: a[0] = "dev";
180: a[1] = "sony";
181: a[2] = 0;
182: gen_dev(0L, interp, 2, a);
183: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.