add ifx adsl tools
[openwrt/openwrt.git] / package / ifxmips_adsl / src / translate.c
1 /*
2 * This program is free software; you can redistribute it and/or modify
3 * it under the terms of the GNU General Public License as published by
4 * the Free Software Foundation; either version 2 of the License, or
5 * (at your option) any later version.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 *
12 * You should have received a copy of the GNU General Public License
13 * along with this program; if not, write to the Free Software
14 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
15 */
16 //-----------------------------------------------------------------------
17 //Description:
18 // winhost script translation tool under Linux for Danube
19 //-----------------------------------------------------------------------
20 //Author: Qi-Ming.Wu@infineon.com
21 //Created: 29-October-2004
22 //-----------------------------------------------------------------------
23 /* History
24 * Last changed on:
25 * Last changed by:
26 *
27 */
28
29 #define _IFXMIPS_ADSL_APP
30 //#define DEBUG
31 #define u32 unsigned int
32 #define u16 unsigned short
33 #define u8 unsigned char
34 #define IFXMIPS_MEI_DEV "/dev/ifxmips/mei"
35 #include <stdio.h>
36 #include <stdlib.h>
37 #include <unistd.h>
38 #include <fcntl.h>
39 #include <errno.h>
40 #include <string.h>
41 #include <time.h>
42 #include <getopt.h>
43 #include <sys/types.h>
44 #include <sys/ioctl.h>
45 #include <sys/stat.h>
46 #include <sys/time.h>
47 #include <sys/mman.h>
48
49 #include <asm/ifxmips/ifxmips.h>
50 #include <asm/ifxmips/ifxmips_mei_app_ioctl.h>
51 #include <asm/ifxmips/ifxmips_mei_app.h>
52 #include <asm/ifxmips/ifxmips_mei_ioctl.h>
53 #include <asm/ifxmips/ifxmips_mei.h>
54
55
56 /*============================definitions======================*/
57 #define OPTN 5
58 #define CNFG 8
59 #define CNTL 1
60 #define STAT 2
61 #define RATE 6
62 #define PLAM 7
63 #define INFO 3
64 #define TEST 4
65
66 typedef unsigned short UINT16;
67 typedef unsigned long UINT32;
68
69
70
71 /*=============================================================*/
72
73
74 /*=============================global variables================*/
75 int c=0;
76 int input_flag=0;
77 int digit_optind=0;
78 FILE* script_file;
79 void (*func)()=NULL;
80 int fd;
81
82 UINT16 var16[8];
83 UINT32 var32[8];
84 UINT16 Message[16];
85
86 /*=============================================================*/
87
88
89
90
91 void display_version()
92 {
93 printf("translate version1.0\nby Wu Qi Ming\nQi-Ming.Wu@infineon.com\n");
94 return;
95 }
96
97
98 void translate_help()
99 {
100 printf("Usage:translate [options] [parameter] ...\n");
101 printf("options:\n");
102 printf("-h --help Display help information\n");
103 printf("-v --version Display version information\n");
104 printf("-f --file Specify the script file\n");
105 printf("-e --execute Execute the specified script file\n");
106 //printf("-c --check Check the script file\n");
107 return;
108 }
109
110 /*
111 print the content in buf excluding the command "echo" itself.
112 */
113
114 void echo(char* buf)
115 {
116 int i;
117 char msg[128];
118 for(i=0;i<128;i++)
119 {
120 if((buf[i]!=0)&&(buf[i]!=32))
121 {
122 sscanf(buf+i,"%s",&msg);
123 if(strcmp(msg,"echo")==0)
124 i+=4;
125 else break;
126 }
127
128 }
129 for(i;i<128;i++)
130 {
131 if(buf[i]!=0&&(buf[i]!=10))
132 {
133 printf("%c",buf[i]);
134 }
135 }
136
137
138 printf("\n");
139 return;
140
141 }
142
143 static void makeCMV(u8 opcode, u8 group, u16 address, u16 index, int size, u16 * data)
144 {
145
146 memset(Message, 0, 16*2);
147 Message[0]= (opcode<<4) + (size&0xf);
148 if(opcode == H2D_DEBUG_WRITE_DM)
149 Message[1]= (group&0x7f);
150 else
151 Message[1]= (((index==0)?0:1)<<7) + (group&0x7f);
152 Message[2]= address;
153 Message[3]= index;
154 if((opcode == H2D_CMV_WRITE)||(opcode == H2D_DEBUG_WRITE_DM))
155 memcpy(Message+4, data, size*2);
156
157 return;
158 }
159
160
161
162 UINT16 CMV_read(char* str_group,int address,int index)
163 {
164 int group=0;
165 if(strcmp(str_group,"optn")==0)
166 group=OPTN;
167 else if(strcmp(str_group,"cnfg")==0)
168 group=CNFG;
169 else if(strcmp(str_group,"cntl")==0)
170 group=CNTL;
171 else if(strcmp(str_group,"stat")==0)
172 group=STAT;
173 else if(strcmp(str_group,"rate")==0)
174 group=RATE;
175 else if(strcmp(str_group,"plam")==0)
176 group=PLAM;
177 else if(strcmp(str_group,"info")==0)
178 group=INFO;
179 else if(strcmp(str_group,"test")==0)
180 group=TEST;
181 else
182 {
183 printf("wrong group type!\ncheck script file please!\n");
184 exit(0);
185 }
186
187 #ifndef DEBUG
188 makeCMV(H2D_CMV_READ, group, address, index, 1, NULL);
189 if(ioctl(fd, IFXMIPS_MEI_CMV_WINHOST, &Message)<0){
190 printf("cr read %d %d %d fail",group,address,index);
191 exit(0);
192 }
193 #endif
194
195 return Message[4];
196
197
198 }
199
200
201 int CMV_write(char* str_group,int address,int index,UINT16 value)
202 {
203 int group=0;
204 if(strcmp(str_group,"optn")==0)
205 group=OPTN;
206 else if(strcmp(str_group,"cnfg")==0)
207 group=CNFG;
208 else if(strcmp(str_group,"cntl")==0)
209 group=CNTL;
210 else if(strcmp(str_group,"stat")==0)
211 group=STAT;
212 else if(strcmp(str_group,"rate")==0)
213 group=RATE;
214 else if(strcmp(str_group,"plam")==0)
215 group=PLAM;
216 else if(strcmp(str_group,"info")==0)
217 group=INFO;
218 else if(strcmp(str_group,"test")==0)
219 group=TEST;
220 else
221 {
222 printf("wrong group type!\ncheck script file please!\n");
223 exit(0);
224 }
225
226 #ifndef DEBUG
227 makeCMV(H2D_CMV_WRITE, group, address, index, 1, &value);
228 if(ioctl(fd, IFXMIPS_MEI_CMV_WINHOST, &Message)<0){
229 printf("cw %d %d %d fail",group,address,index);
230 return -1;
231 }
232 #endif
233
234 return 0;
235
236
237 }
238
239 void execute_script()
240 {
241 char buf[128];
242 char str_command[20]={0};
243 char str_group[20]={0};
244 char str_value[128]={0};
245 char op1[40],op2[40];
246 int address,index;
247 int n=0;
248 UINT16 value=0;
249 if(!script_file) return;
250
251 while(fgets(buf,128,script_file))/*scan one line into buffer, 128 bytes at most*/
252 {
253 if(sscanf(buf,"%s",&str_command)==0) continue;
254 /*if the line is empty, then go on to the next*/
255 if(strcmp(str_command,"cr")==0)/*cr command*/
256 {
257 sscanf(buf,"%s %s %d %d %s",&str_command,\
258 &str_group,\
259 &address,\
260 &index,\
261 &str_value);
262 if(strncmp(str_value,"$",1)!=0)
263 {
264 printf("error:cr parameter type mismatch!\n");
265 break;
266 }
267 n=strtoul(str_value+1,NULL,0);
268 var16[n]=CMV_read(str_group,address,index);
269 printf("read %s %d %d, value=%04x\n",str_group, address, index,var16[n]);
270 }
271 else if(strcmp(str_command,"cw")==0)/*cw command*/
272 {
273 sscanf(buf,"%s %s %d %d %s",&str_command,\
274 &str_group,\
275 &address,\
276 &index,\
277 &str_value);
278 n=strtoul(str_value+1,NULL,0);
279 if(strncmp(str_value,"$",1)==0)
280 {
281 value=var16[n];
282 }
283 else if(strncmp(str_value,"#",1)==0)
284 {
285 value=strtoul(str_value+1,NULL,0);
286 }
287 else
288 {
289 value=strtoul(str_value,NULL,0);
290 }
291 if(CMV_write(str_group,address,index,value)<0)
292 {
293 break;
294 }
295 }
296
297 else if(strcmp(str_command,"mw")==0)/*mr command*/
298 {
299
300 sscanf(buf,"%s %s %s",&str_command,\
301 &op1,\
302 &str_value);
303
304 n=strtoul(str_value+1,NULL,0);
305 address=strtoul(op1,NULL,0);
306 if(strncmp(str_value,"$",1)==0)
307 {
308 value=var16[n];
309 }
310 else if(strncmp(str_value,"#",1)==0)
311 {
312 value=strtoul(str_value+1,NULL,0);
313 }
314 else
315 {
316 value=strtoul(str_value,NULL,0);
317
318 }
319
320 makeCMV(H2D_DEBUG_WRITE_DM, 0x0, address>>16, (address)&(0xffff), 1, &value);
321 if(ioctl(fd, IFXMIPS_MEI_CMV_WINHOST, &Message)<0){
322 printf("mw %08x fail",address);
323 break;
324
325 }
326
327 }
328
329 else if(strcmp(str_command,"mr")==0)/*mr command*/
330 {
331
332 sscanf(buf,"%s %s %s",&str_command,\
333 &op1,\
334 &str_value);
335 address=strtoul(op1,NULL,0);
336 n=strtoul(str_value+1,NULL,0);
337 if(strncmp(str_value,"$",1)!=0)
338 {
339 printf("error:mr parameter type mismatch!\n");
340 break;
341 }
342 makeCMV(H2D_DEBUG_READ_DM, 0x0, address>>16, (address)&(0xffff), 1, NULL);
343 if(ioctl(fd, IFXMIPS_MEI_CMV_WINHOST, &Message)<0){
344 printf("mw %08x fail",address);
345 break;
346 }
347 value=Message[4];
348 var16[n]=value;
349 }
350
351
352
353 else if(strcmp(str_command,"meiw")==0)/*meiw command*/
354 {
355 meireg regrdwr;
356 sscanf(buf,"%s %s %s",&str_command,\
357 &op1,\
358 &op2);
359 regrdwr.iAddress=strtoul(op1,NULL,0)+IFXMIPS_MEI_BASE_ADDR;
360
361
362 if(strncmp(op2,"#",1)==0) regrdwr.iData=strtoul(op1+1,NULL,0);
363 else if(strncmp(op2,"$",1)==0) regrdwr.iData=var16[strtoul(op2+1,NULL,0)];
364 else if(strncmp(op2,"@",1)==0) regrdwr.iData=var32[strtoul(op2+1,NULL,0)];
365 else regrdwr.iData=strtoul(op1,NULL,0);
366 //printf("address=%08x\n", regrdwr.iAddress);
367 if(ioctl(fd, IFXMIPS_MEI_CMV_WRITE, &regrdwr)<0){
368 printf("meiw fail\n");
369 break;;
370 }
371
372 }
373
374 else if(strcmp(str_command,"meir")==0)/*meir command*/
375 {
376 meireg regrdwr;
377 sscanf(buf,"%s %s %s",&str_command,\
378 &op1,\
379 &op2);
380 regrdwr.iAddress=strtoul(op1,NULL,0)+IFXMIPS_MEI_BASE_ADDR;
381 if(ioctl(fd, IFXMIPS_MEI_CMV_READ, &regrdwr)<0){
382 printf("meir fail\n");
383 break;
384 }
385 if(strncmp(op2,"$",1)==0) var16[strtoul(op2+1,NULL,0)]=regrdwr.iData;
386 else if(strncmp(op2,"@",1)==0) var32[strtoul(op2+1,NULL,0)]=regrdwr.iData;
387 else
388 {
389 printf("meir grammar error!\n");
390 break;
391 }
392
393 }
394
395
396 else if(strcmp(str_command,"lst")==0)/*lst command*/
397 {
398
399 sscanf(buf,"%s %s",&str_command,\
400 &str_value);
401
402 if(strncmp(str_value,"$",1)==0)
403 {
404 n=strtoul(str_value+1,NULL,0);
405 printf("$%d=0x%04x\n",n,var16[n]);
406
407 }
408 else if(strncmp(str_value,"@",1)==0)
409 {
410 n=strtoul(str_value+1,NULL,0);
411 printf("$%d=0x%08x\n",n,var32[n]);
412
413 }
414 else
415 {
416 printf("lst grammar error!\n");
417 break;
418 }
419 }
420
421 else if(strcmp(str_command,"echo")==0)/*echo command*/
422 {
423 echo(buf);
424 }
425 else if(strcmp(str_command,"mov")==0)/*mov command*/
426 {
427 sscanf(buf,"%s %s %s",&str_command,\
428 &op1,\
429 &op2);
430 if(strncmp(op1,"$",1)==0)
431 {
432 if(strncmp(op2,"$",1)==0)
433 {
434 var16[strtoul(op1+1,NULL,0)]=var16[strtoul(op2+1,NULL,0)];
435 }
436 else if(strncmp(op2,"@",1)==0)
437 {
438 var16[strtoul(op1+1,NULL,0)]= var32[strtoul(op2+1,NULL,0)];
439
440 }
441 else if(strncmp(op2,"#",1)==0)
442 {
443 var16[strtoul(op1+1,NULL,0)]=strtoul(op2+1,NULL,0);
444 }
445 else
446 {
447 var16[strtoul(op1+1,NULL,0)]=strtoul(op2,NULL,0);
448
449 }
450 }
451 else if(strncmp(op1,"@",1)==0)
452 {
453 if(strncmp(op2,"$",1)==0)
454 {
455 var32[strtoul(op1+1,NULL,0)]=var16[strtoul(op2+1,NULL,0)];
456 }
457 else if(strncmp(op2,"@",1)==0)
458 {
459 var32[strtoul(op1+1,NULL,0)]= var32[strtoul(op2+1,NULL,0)];
460
461 }
462 else if(strncmp(op2,"#",1)==0)
463 {
464 var32[strtoul(op1+1,NULL,0)]=strtoul(op2+1,NULL,0);
465 }
466 }
467 else
468 {
469 printf("grammar error!\n");
470 break;
471 }
472
473
474 }
475
476
477 else if(strcmp(str_command,"or")==0)/*or command*/
478 {
479 sscanf(buf,"%s %s %s",&str_command,\
480 &op1,\
481 &op2);
482 if(strncmp(op1,"$",1)==0)
483 {
484 if(strncmp(op2,"$",1)==0)
485 {
486 var16[strtoul(op1+1,NULL,0)]|=var16[strtoul(op2+1,NULL,0)];
487 }
488 else if(strncmp(op2,"@",1)==0)
489 {
490 var16[strtoul(op1+1,NULL,0)]|= var32[strtoul(op2+1,NULL,0)];
491
492 }
493 else if(strncmp(op2,"#",1)==0)
494 {
495 var16[strtoul(op1+1,NULL,0)]|=strtoul(op2+1,NULL,0);
496 }
497 }
498 else if(strncmp(op1,"@",1)==0)
499 {
500 if(strncmp(op2,"$",1)==0)
501 {
502 var32[strtoul(op1+1,NULL,0)]|=var16[strtoul(op2+1,NULL,0)];
503 }
504 else if(strncmp(op2,"@",1)==0)
505 {
506 var32[strtoul(op1+1,NULL,0)]|= var32[strtoul(op2+1,NULL,0)];
507
508 }
509 else if(strncmp(op2,"#",1)==0)
510 {
511 var32[strtoul(op1+1,NULL,0)]|=strtoul(op2+1,NULL,0);
512 }
513 }
514 else
515 {
516 printf("grammar error!\n");
517 break;
518 }
519 }
520
521 else if(strcmp(str_command,"and")==0)/*and command*/
522 {
523 sscanf(buf,"%s %s %s",&str_command,\
524 &op1,\
525 &op2);
526 if(strncmp(op1,"$",1)==0)
527 {
528 if(strncmp(op2,"$",1)==0)
529 {
530 var16[strtoul(op1+1,NULL,0)]&=var16[strtoul(op2+1,NULL,0)];
531 }
532 else if(strncmp(op2,"@",1)==0)
533 {
534 var16[strtoul(op1+1,NULL,0)]&= var32[strtoul(op2+1,NULL,0)];
535
536 }
537 else if(strncmp(op2,"#",1)==0)
538 {
539 var16[strtoul(op1+1,NULL,0)]&=strtoul(op2+1,NULL,0);
540 }
541 }
542 else if(strncmp(op1,"@",1)==0)
543 {
544 if(strncmp(op2,"$",1)==0)
545 {
546 var32[strtoul(op1+1,NULL,0)]&=var16[strtoul(op2+1,NULL,0)];
547 }
548 else if(strncmp(op2,"@",1)==0)
549 {
550 var32[strtoul(op1+1,NULL,0)]&= var32[strtoul(op2+1,NULL,0)];
551
552 }
553 else if(strncmp(op2,"#",1)==0)
554 {
555 var32[strtoul(op1+1,NULL,0)]&=strtoul(op2+1,NULL,0);
556 }
557 }
558 else
559 {
560 printf("grammar error!\n");
561 break;
562 }
563 }
564 else if(strcmp(str_command,"not")==0)/*not command*/
565 {
566 sscanf(buf,"%s %s",&str_command,\
567 &op1);
568 if(strncmp(op1,"$",1)==0)
569 {
570 var16[strtoul(op1+1,NULL,0)]=~var16[strtoul(op1+1,NULL,0)];
571 }
572 else if(strncmp(op1,"@",1)==0)
573 {
574 var32[strtoul(op1+1,NULL,0)]=~var32[strtoul(op1+1,NULL,0)];
575 }
576 else
577 {
578 printf("grammar error!\n");
579 break;
580 }
581 }
582 else if(strcmp(str_command,"shl")==0)/*shl command*/
583 {
584 sscanf(buf,"%s %s %s",&str_command,\
585 &op1,\
586 &op2);
587 if(strncmp(op1,"$",1)==0)
588 {
589 if(strncmp(op2,"$",1)==0)
590 {
591 var16[strtoul(op1+1,NULL,0)]<<=var16[strtoul(op2+1,NULL,0)];
592 }
593 else if(strncmp(op2,"@",1)==0)
594 {
595 var16[strtoul(op1+1,NULL,0)]<<= var32[strtoul(op2+1,NULL,0)];
596
597 }
598 else if(strncmp(op2,"#",1)==0)
599 {
600 var16[strtoul(op1+1,NULL,0)]<<=strtoul(op2+1,NULL,0);
601 }
602 }
603 else if(strncmp(op1,"@",1)==0)
604 {
605 if(strncmp(op2,"$",1)==0)
606 {
607 var32[strtoul(op1+1,NULL,0)]<<=var16[strtoul(op2+1,NULL,0)];
608 }
609 else if(strncmp(op2,"@",1)==0)
610 {
611 var32[strtoul(op1+1,NULL,0)]<<= var32[strtoul(op2+1,NULL,0)];
612
613 }
614 else if(strncmp(op2,"#",1)==0)
615 {
616 var32[strtoul(op1+1,NULL,0)]<<=strtoul(op2+1,NULL,0);
617 }
618 }
619 else
620 {
621 printf("grammar error!\n");
622 break;
623 }
624 }
625
626 else if(strcmp(str_command,"shr")==0)/*shr command*/
627 {
628 sscanf(buf,"%s %s %s",&str_command,\
629 &op1,\
630 &op2);
631 if(strncmp(op1,"$",1)==0)
632 {
633 if(strncmp(op2,"$",1)==0)
634 {
635 var16[strtoul(op1+1,NULL,0)]>>=var16[strtoul(op2+1,NULL,0)];
636 }
637 else if(strncmp(op2,"@",1)==0)
638 {
639 var16[strtoul(op1+1,NULL,0)]>>= var32[strtoul(op2+1,NULL,0)];
640
641 }
642 else if(strncmp(op2,"#",1)==0)
643 {
644 var16[strtoul(op1+1,NULL,0)]>>=strtoul(op2+1,NULL,0);
645 }
646 }
647 else if(strncmp(op1,"@",1)==0)
648 {
649 if(strncmp(op2,"$",1)==0)
650 {
651 var32[strtoul(op1+1,NULL,0)]>>=var16[strtoul(op2+1,NULL,0)];
652 }
653 else if(strncmp(op2,"@",1)==0)
654 {
655 var32[strtoul(op1+1,NULL,0)]>>= var32[strtoul(op2+1,NULL,0)];
656
657 }
658 else if(strncmp(op2,"#",1)==0)
659 {
660 var32[strtoul(op1+1,NULL,0)]>>=strtoul(op2+1,NULL,0);
661 }
662 }
663 else
664 {
665 printf("grammar error!\n");
666 break;
667 }
668 }
669
670 else if(strcmp(str_command,"add")==0)/*add command*/
671 {
672 sscanf(buf,"%s %s %s",&str_command,\
673 &op1,\
674 &op2);
675 if(strncmp(op1,"$",1)==0)
676 {
677 if(strncmp(op2,"$",1)==0)
678 {
679 var16[strtoul(op1+1,NULL,0)]+=var16[strtoul(op2+1,NULL,0)];
680 }
681 else if(strncmp(op2,"@",1)==0)
682 {
683 var16[strtoul(op1+1,NULL,0)]+= var32[strtoul(op2+1,NULL,0)];
684
685 }
686 else if(strncmp(op2,"#",1)==0)
687 {
688 var16[strtoul(op1+1,NULL,0)]+=strtoul(op2+1,NULL,0);
689 }
690 }
691 else if(strncmp(op1,"@",1)==0)
692 {
693 if(strncmp(op2,"$",1)==0)
694 {
695 var32[strtoul(op1+1,NULL,0)]+=var16[strtoul(op2+1,NULL,0)];
696 }
697 else if(strncmp(op2,"@",1)==0)
698 {
699 var32[strtoul(op1+1,NULL,0)]+= var32[strtoul(op2+1,NULL,0)];
700
701 }
702 else if(strncmp(op2,"#",1)==0)
703 {
704 var32[strtoul(op1+1,NULL,0)]+=strtoul(op2+1,NULL,0);
705 }
706 }
707 else
708 {
709 printf("grammar error!\n");
710 break;
711 }
712 }
713 else if(strcmp(str_command,"sub")==0)/*sub command*/
714 {
715 sscanf(buf,"%s %s %s",&str_command,\
716 &op1,\
717 &op2);
718 if(strncmp(op1,"$",1)==0)
719 {
720 if(strncmp(op2,"$",1)==0)
721 {
722 var16[strtoul(op1+1,NULL,0)]-=var16[strtoul(op2+1,NULL,0)];
723 }
724 else if(strncmp(op2,"@",1)==0)
725 {
726 var16[strtoul(op1+1,NULL,0)]-= var32[strtoul(op2+1,NULL,0)];
727
728 }
729 else if(strncmp(op2,"#",1)==0)
730 {
731 var16[strtoul(op1+1,NULL,0)]-=strtoul(op2+1,NULL,0);
732 }
733 }
734 else if(strncmp(op1,"@",1)==0)
735 {
736 if(strncmp(op2,"$",1)==0)
737 {
738 var32[strtoul(op1+1,NULL,0)]-=var16[strtoul(op2+1,NULL,0)];
739 }
740 else if(strncmp(op2,"@",1)==0)
741 {
742 var32[strtoul(op1+1,NULL,0)]-= var32[strtoul(op2+1,NULL,0)];
743
744 }
745 else if(strncmp(op2,"#",1)==0)
746 {
747 var32[strtoul(op1+1,NULL,0)]-=strtoul(op2+1,NULL,0);
748 }
749 }
750 else
751 {
752 printf("grammar error!\n");
753 break;
754 }
755 }
756
757 memset(str_command,0,20);
758 memset(buf,0,128);
759 }
760 return;
761 }
762
763 int main (int argc, char** argv) {
764
765 #ifndef DEBUG
766 fd=open(IFXMIPS_MEI_DEV, O_RDWR);
767 if(fd<0){
768 printf("\n\n autoboot open device fail\n");
769 return -1;
770 }
771 #endif
772 while(1) {
773 int option_index=0;
774 static struct option long_options[] ={
775 {"help",0,0,0},
776 {"version",0,0,0},
777 {"file",1,0,0},
778 {"execute",0,0,0}
779 };
780
781 c = getopt_long(argc,argv, "hvf:e",
782 long_options, &option_index);
783
784 //printf("c=%d option_index=%d\n",c,option_index);
785 if(c==-1)
786 {
787 if(input_flag==0)
788 {
789 printf("translate:please specify parameters\n");
790 func=&translate_help;
791 }
792 if(func)
793 (*func)();
794 else
795 {
796 ERROR: translate_help();
797 }
798 break;
799 }
800 input_flag=1;
801 switch (c) {
802 case 0:
803 if(option_index==0)
804 {
805 func=&translate_help;
806 break;
807 }
808 if(option_index==1)
809 {
810 func=&display_version;
811 break;
812 }
813 if(option_index==2)
814 {
815 goto FILE;
816 break;
817 }
818 if(option_index==3)
819 {
820 goto EXECUTE;
821 break;
822 }
823 case 'h':
824 func=&translate_help;
825 break;
826 case 'v':
827 func=&display_version;
828 break;
829 case 'f':
830 FILE: if(!optarg) goto ERROR;
831 script_file=fopen((char*)optarg,"r");
832 if(!script_file) perror("fopen");
833 break;
834 case 'e':
835 EXECUTE: func=&execute_script;
836 break;
837 }
838
839
840 }
841 if(script_file) fclose(script_file);
842 #ifndef DEBUG
843 close(fd);
844 #endif
845 }
846
847
848