Annotation of capa/capa51/pProj/allcapaid.c, revision 1.1.1.1
1.1 albertel 1:
2: /* ========================================================================== */
3: /* ========================================================================== */
4: /* allcapaid.c created by Isaac Tsai */
5: /* 1998, 1999 copyrighted by Isaac Tsai */
6: /**************************************************************************** */
7: #ifdef NeXT
8: #include <stdlib.h>
9: #include <sys/types.h>
10: #include <sys/stat.h>
11: #else
12: #include <malloc.h>
13: double atof();
14: #endif
15:
16: #include <stdio.h>
17: #include <ctype.h>
18: #include <sys/types.h>
19: #include <sys/stat.h>
20:
21: #include <signal.h>
22: #include <time.h>
23: #include <math.h>
24: #include <string.h>
25: #ifdef NeXT
26: #include <bsd/curses.h>
27: #else
28: #include <curses.h>
29: #endif
30: #define YES 1
31:
32: #include "capaCommon.h"
33: #include "ranlib.h"
34:
35: char *progname;
36:
37: /* filter out the number to be [1:999] */
38: int scan_num(char *num_str,int *first, int *second) {
39: char tmp_str[SMALL_LINE_BUFFER], *ch;
40: int ii=0, a_num, b_num, result=0;
41:
42: ch = num_str;
43: tmp_str[ii] = 0;
44: while( isspace(*ch) ) ch++;
45: while(isdigit(*ch)) { tmp_str[ii++] = *ch; ch++; }
46: tmp_str[ii] = 0;
47: sscanf(tmp_str,"%d",&a_num);
48: if( a_num < 0 || a_num > 999 ) a_num = 1;
49: *first = a_num;
50: result = 1;
51: while( isspace(*ch) ) ch++;
52: if( *ch == ':' ) {
53: ch++;
54: while( isspace(*ch) ) ch++;
55: ii=0; tmp_str[ii] = 0;
56: while( isdigit(*ch) ) { tmp_str[ii++] = *ch; ch++; }
57: tmp_str[ii] = 0;
58: sscanf(tmp_str,"%d",&b_num);
59: if( b_num < 0 || b_num > 999 ) b_num = 1;
60: if( a_num > b_num ) b_num = a_num;
61: *second = b_num;
62: result = 2;
63: }
64: return (result);
65: }
66:
67: void print_capaidplus (FILE *out,char* stunum,int set,int plus)
68: {
69: char fmt[SMALL_LINE_BUFFER];
70: sprintf(fmt,"%%%dc",4+plus);
71: fprintf(out,"%s ", capa_id_plus(stunum, set, plus));
72: }
73:
74: void print_capaidplus_header1(FILE *dfp,int StartSet,int EndSet,int plus)
75: {
76: int pluscnt,setIdx;
77: for(setIdx = StartSet; setIdx <= EndSet; setIdx++)
78: {
79: fprintf(dfp,"%3d",setIdx);
80: for(pluscnt=0; pluscnt < (plus+2); pluscnt++)
81: fprintf(dfp," ");
82: }
83: }
84:
85: void print_capaidplus_header2(FILE *dfp,int StartSet,int EndSet,int plus)
86: {
87: int setIdx,pluscnt;
88: for(setIdx = StartSet; setIdx <= EndSet; setIdx++) {
89: for(pluscnt=0; pluscnt < (plus+4); pluscnt++)
90: fprintf(dfp,"-");
91: fprintf(dfp,"|");
92: }
93: }
94:
95: void usage()
96: {
97: printf("USAGE: %s [-s start-set] [-e end-set] [-stu student-number] [-c class-directory] [-d output-directory] [-h] [-i] [-p number] [-sec [n|n:m]]\n", progname);
98: printf(" start-set : default 1\n");
99: printf(" end-set : default 10\n");
100: printf(" student-number : no default\n");
101: printf(" class-directory : no default\n");
102: printf(" output-directory: class-directory/capaID\n");
103: printf(" -Sec 3 : for section 3\n");
104: printf(" -Sec 3:7 : from section 3 to section 7\n");
105: printf(" -i : don't create files, print to the screen\n");
106: printf(" -p 2 : output 6 charatcer capaidplus instead of capaid\n");
107: printf(" -h : prints this message\n");
108: printf(" CAPA version %s, %s\n",CAPA_VER,COMPILE_DATE);
109: }
110: #define F_CLASS 1
111: #define F_SECTIONS 2
112: #define F_STUDENT 3
113: int main (int argc, char **argv)
114: {
115: T_student *students_p,*s_p;
116: int i, setIdx, numStudents, count, tmp_num, StartSec=1,EndSec=999;
117: int StartSet = 1, EndSet = 10, classnameOK=0,outputDir=0,plus=0;
118: int SecCntArry[MAX_SECTION_COUNT], sectionIdx;
119: char filename[MAX_BUFFER_SIZE], path[MAX_BUFFER_SIZE],
120: outputPath[MAX_BUFFER_SIZE], fullpath[MAX_BUFFER_SIZE];
121: char StuNum[MAX_STUDENT_NUMBER+1];
122: int ForWhat=F_CLASS, interactive=0;
123: FILE *dfp;
124:
125: if( argc == 0 ) {
126: usage();
127: exit(0);
128: }
129:
130: for( progname = *argv++; --argc; argv++) {
131: if ( argv[0][0] == '-' && (strlen(argv[0]) > 1 ) ) {
132: switch(argv[0][1]) {
133: case 'S':
134: case 's':
135: if( strncasecmp(argv[0],"-stu",4) == 0 ) {
136: for(i=0;i<MAX_STUDENT_NUMBER;i++) {
137: StuNum[i] = argv[1][i];
138: }
139: StuNum[i]=0;
140: ForWhat = F_STUDENT;
141: } else if( strncasecmp(argv[0],"-sec",4) == 0 ) {
142: tmp_num = scan_num(argv[1],&StartSec,&EndSec);
143: if (tmp_num == 1 ) { EndSec = StartSec; }
144: ForWhat = F_SECTIONS;
145: } else if( strncasecmp(argv[0],"-s",2) == 0 ) {
146: StartSet = atol(argv[1]);
147: if( StartSet <= 0 ) StartSet = 1;
148: }
149: break;
150: case 'p':
151: plus = atol(argv[1]);
152: break;
153: case 'e':
154: EndSet = atol(argv[1]);
155: if( EndSet > 999 ) EndSet = 99;
156: break;
157: case 'c':
158: strcpy(path,argv[1]);
159: if( capa_access(path, F_OK) == -1 ) {
160: printf("No such class [%s] please specify it again:\n",path);
161: classnameOK = 0;
162: } else {
163: classnameOK = 1;
164: }
165: break;
166: case 'i':
167: interactive = 1;
168: break;
169: case 'd':
170: strcpy(outputPath,argv[1]);
171: outputDir=1;
172: break;
173: case 'u': case 'h': default:
174: usage();
175: exit(0);
176: break;
177: }
178: }
179: }
180: if( StartSet > EndSet ) StartSet = EndSet;
181: while ( !classnameOK ) {
182: puts("Enter the ABSOLUTE path of class from root (/)");
183: scanf("%s", path);
184: if( capa_access(path, F_OK) == -1 ) {
185: printf("No such class, please specify it again:\n");
186: } else {
187: classnameOK = 1;
188: }
189: }
190:
191: if (!interactive) {
192: if (outputDir) {
193: sprintf(fullpath,"%s",outputPath);
194: } else {
195: sprintf(fullpath,"%s/capaID",path);
196: }
197: if( capa_access(fullpath, F_OK) == -1 ) {
198: if ( mkdir(fullpath, S_IREAD | S_IWRITE | S_IEXEC ) == -1 ) {
199: printf("Unable to write to %s\n",fullpath);
200: printf("Please check this directory and run %s again.\n",progname);
201: return(-1);
202: }
203: }
204: }
205:
206: chdir(path);
207: switch(ForWhat) {
208: case F_STUDENT:
209: printf("\n");
210: for(setIdx = StartSet; setIdx <= EndSet; setIdx++) {
211: printf("%4d ", setIdx );
212: }
213: printf("\n");
214: for(setIdx = StartSet; setIdx <= EndSet; setIdx++) {
215: if (plus)
216: print_capaidplus(stdout,StuNum,setIdx,plus);
217: else
218: printf("%4d ", capa_PIN(StuNum, setIdx,0) );
219: }
220: printf("\n"); fflush(stdout);
221: break;
222: case F_CLASS:
223: StartSec=1;EndSec=999;
224: case F_SECTIONS:
225: if ((count = capa_get_section_count( SecCntArry )) != 0 ) {
226: if (count == -1 ) {
227: printf("classl file not found in %s\n",path);
228: exit (-1);
229: }
230: for(sectionIdx = StartSec;
231: (sectionIdx <= SecCntArry[0]) && (sectionIdx <= EndSec);
232: sectionIdx++) {
233: if( SecCntArry[sectionIdx] > 0 ) {
234: if ( interactive ) {
235: dfp=stdout;
236: } else {
237: sprintf(filename,"%s/section%d.capaid",fullpath,sectionIdx);
238: if((dfp=fopen(filename,"w"))==NULL) {
239: printf("Unable to create %s\n",filename);
240: exit(-2);
241: }
242: }
243:
244: numStudents = capa_get_section(&students_p, sectionIdx);
245: printf("Section %d, %d students\n",
246: sectionIdx, numStudents);
247:
248: fprintf(dfp,"Section %d Student NAME NUMBER ",sectionIdx);
249: if (plus) {
250: print_capaidplus_header1(dfp,StartSet,EndSet,plus);
251: } else {
252: for(setIdx = StartSet; setIdx <= EndSet; setIdx++)
253: fprintf(dfp,"%3d ",setIdx);
254: }
255:
256: fprintf(dfp,"\n");
257: fprintf(dfp,"------------------------------|----------|");
258: if (plus) {
259: print_capaidplus_header2(dfp,StartSet,EndSet,plus);
260: } else {
261: for(setIdx = StartSet; setIdx <= EndSet; setIdx++)
262: fprintf(dfp,"----|");
263: }
264: fprintf(dfp,"\n");
265: for(s_p = students_p; s_p ; s_p = s_p->s_next ) {
266: fprintf(dfp,"%s %s ",s_p->s_nm, s_p->s_sn);
267: for(setIdx = StartSet; setIdx <= EndSet; setIdx++) {
268: if (plus)
269: print_capaidplus(dfp,s_p->s_sn,setIdx,plus);
270: else
271: fprintf(dfp,"%4d ", capa_PIN(s_p->s_sn, setIdx,0) );
272: }
273: fprintf(dfp,"\n");
274: }
275: fflush(dfp);
276: if (!interactive) fclose(dfp);
277: }
278: }
279: }
280: }
281: return (0);
282: }
283:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>