Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. /*
  2.         dZ80 Parse Command Line
  3. */
  4.  
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <ctype.h>
  8. #include <string.h>
  9.  
  10. #include "types.h"
  11. #include "dissz80.h"
  12. #include "dz80.h"
  13.  
  14. static int GetDWord(char *Str, DWORD *pDW);
  15. static int GetWord(char *Str, WORD *pWord);
  16. static int CopyStringParam(char *dst, char *src, int maxlen);
  17.  
  18. int ParseCmdLine(DISZ80 *d, int startArgc, int argc, char* argv[])
  19. {
  20.         int     i, numFileNames;
  21.         WORD    r;
  22.         char    j, cpu[16];
  23.  
  24.         d->flagsModified = 0;
  25.         d->parametersModified = 0;
  26.         numFileNames = 0;
  27.  
  28.         for (i = startArgc; i < argc; i++)
  29.                 {
  30.                 if (argv[i][0] == '/' || argv[i][0] == '-')
  31.                         {
  32.                         switch (tolower(argv[i][1]))
  33.                                 {
  34.                                 case 'l':
  35.                                         d->flags |= DISFLAG_LABELLED;
  36.                                         continue;
  37.  
  38.                                 case 'h':
  39.                                         if (GetDWord(&argv[i][2], &d->fileHeaderSize))
  40.                                                 return TRUE;
  41.                                         continue;
  42.  
  43.                                
  44.                                 case 'm':
  45.                                         if (GetWord(&argv[i][2], &d->fileStartAddr))
  46.                                                 return TRUE;
  47.                                         continue;
  48.  
  49.                                        
  50.                                 case 's':
  51.                                         if (GetWord(&argv[i][2], &d->start))
  52.                                                 return TRUE;
  53.                                         d->parametersModified |= DPM_STARTADDR;
  54.                                         continue;
  55.                                
  56.  
  57.                                 case 'e':
  58.                                         if (GetWord(&argv[i][2], &d->end))
  59.                                                 return TRUE;
  60.                                         d->parametersModified |= DPM_ENDADDR;
  61.                                         continue;
  62.                                
  63.  
  64.                                 case 'o':
  65.                                         if (CopyStringParam(d->opMapFileName, &argv[i][2], sizeof(d->opMapFileName)) )
  66.                                                 return TRUE;
  67.                                         continue;
  68.                                
  69.  
  70.                                 case 'r':
  71.                                         if (CopyStringParam(d->refFileName, &argv[i][2], sizeof(d->refFileName)) )
  72.                                                 return TRUE;
  73.                                         continue;
  74.        
  75.  
  76.                                 case 'a':
  77.                                         d->flags &= ~DISFLAG_ADDRDUMP;
  78.                                         continue;
  79.  
  80.                                
  81.                                 case 'n':
  82.                                         d->flags &= ~DISFLAG_OPCODEDUMP;
  83.                                         continue;
  84.  
  85.                                
  86.                                 case 'u':
  87.                                         d->flags |= DISFLAG_UPPER;
  88.                                         continue;
  89.  
  90.                                
  91.                                 case 'q':
  92.                                         d->flags |= DISFLAG_QUIET;
  93.                                         continue;
  94.  
  95.                                
  96.                                 case 'z':
  97.                                         CopyStringParam(cpu, &argv[i][2], sizeof(cpu));
  98.  
  99.  
  100.                                         for(j=0; j < DCPU_TOTAL; j++)
  101.                                                 {
  102.                                                 if (!(stricmp(cpu, dZ80CpuTypeNames[j])))
  103.                                                         {
  104.                                                         d->cpuType = j;
  105.                                                         break;
  106.                                                         }
  107.                                                 }
  108.  
  109.                                         if (j >= DCPU_TOTAL)
  110.                                                 {
  111.                                                 printf("Unknown CPU type \"%s\". Must be one of the following:\n\n", cpu);
  112.                                                 for(j=0; j < DCPU_TOTAL; j++)
  113.                                                         printf("%s\n", dZ80CpuTypeNames[j]);
  114.                                                 return TRUE;
  115.                                                 }
  116.  
  117.                                         continue;
  118.  
  119.                                
  120.                                 case 'b':
  121.                                         d->flags &= ~DISFLAG_USELABELADDRS;
  122.                                         continue;
  123.  
  124.                                
  125.                                 case 'w':
  126.                                         d->flags &= ~DISFLAG_LINECOMMANDS;
  127.                                         continue;
  128.  
  129.                                 case 'x':
  130.                                         switch (tolower(argv[i][2]))
  131.                                                 {
  132.                                                
  133.                                                 case 'o':
  134.                                                         d->flags |= DISFLAG_REFOUTPORT;
  135.                                                         break;
  136.  
  137.                                                
  138.                                                 case 'i':
  139.                                                         d->flags |= DISFLAG_REFINPORT;
  140.                                                         break;
  141.  
  142.                                                
  143.                                                 case 'a':
  144.                                                         d->flags |= DISFLAG_REFADDR;
  145.                                                         break;
  146.  
  147.                                                
  148.                                                 case 'n':
  149.                                                         d->flags |= DISFLAG_REFINDIRECT;
  150.                                                         break;
  151.  
  152.                                                
  153.                                                 case 'r':
  154.                                                         d->flags |= DISFLAG_REFLIMITRANGE;
  155.                                                         break;
  156.  
  157.                                                
  158.                                                 default:
  159.                                                         printf("Unknown reference type \"%c\". Valid types are o, i, a, n and r.\n",  argv[i][2]);
  160.                                                         return TRUE;
  161.                                                 }
  162.                                         continue;
  163.  
  164.                                
  165.                                 case '?':
  166.                                         ShowUsage();
  167.                                         return TRUE;
  168.  
  169. /* Added for 1.50 */
  170.                                 case 'd':              
  171.                                         if (CopyStringParam(d->layoutDefineByte, &argv[i][2], sizeof(d->layoutDefineByte)))
  172.                                                 return TRUE;
  173.                                         continue;
  174.  
  175.                                
  176.                                 case 'f':
  177.                                         if (CopyStringParam(d->layoutComment, &argv[i][2], sizeof(d->layoutComment)))
  178.                                                 return TRUE;
  179.                                         continue;
  180.  
  181.                                
  182.                                 case 'p':
  183.                                         if (CopyStringParam(reqLayoutNumberPrefix, &argv[i][2], sizeof(reqLayoutNumberPrefix)))
  184.                                                 return TRUE;
  185.                                         d->parametersModified |= DPM_NUMPREFIX;
  186.                                         continue;
  187.  
  188.                                
  189.                                 case 'y':
  190.                                         if (CopyStringParam(reqLayoutNumberSuffix, &argv[i][2], sizeof(reqLayoutNumberSuffix)))
  191.                                                 return TRUE;
  192.                                         d->parametersModified |= DPM_NUMSUFFIX;
  193.                                         continue;
  194.  
  195.                                
  196.                                 case 'i':
  197.                                         if (GetWord(&argv[i][2], &r))
  198.                                                 return TRUE;
  199.                                
  200.                                         switch(r)
  201.                                                 {
  202.                                                 case 8:
  203.                                                         disRadix = DRADIX_OCTAL;
  204.                                                         break;
  205.  
  206.                                                 case 10:
  207.                                                         disRadix = DRADIX_DECIMAL;
  208.                                                         break;
  209.  
  210.                                                 case 16:
  211.                                                         disRadix = DRADIX_HEX;
  212.                                                         break;
  213.  
  214.                                                 default:
  215.                                                         printf("Radix must be 8, 10 or 16\n"
  216.                                                                    "  Use -? for help.\n");
  217.                                                         return TRUE;
  218.                                                 }
  219.                                         continue;
  220.  
  221. /* 2.0 */
  222.                                 case 'j':
  223.                                         d->flags |= DISFLAG_RELCOMMENT;
  224.                                         continue;
  225.  
  226.                                 case 'k':
  227.                                         if (CopyStringParam(d->scriptFileName, &argv[i][2],  sizeof(d->scriptFileName)) )
  228.                                                 return TRUE;
  229.                                         continue;
  230.  
  231.                                 case 'v':
  232.                                         showVersion = TRUE;
  233.                                         continue;
  234.  
  235.                                 default:
  236.                                         printf("Don't know what to do with \"%s\".\n\n", argv[i]);
  237.                                         printf("  Use -? for help.\n");
  238.                                         return TRUE;
  239.                                 }
  240.                         }
  241.  
  242.  
  243.                 if (numFileNames >= 1)
  244.                         {
  245.                         if (numFileNames >= 2)
  246.                                 {
  247.                                 printf("Already have two file names.\n");
  248.                                 return(1);
  249.                                 }
  250.                         else
  251.                                 {
  252.                                 strcpy(d->outFileName, argv[i]);
  253.                                 }
  254.                         }
  255.                 else
  256.                         {
  257.                         strcpy(d->srcFileName, argv[i]);
  258.                         }
  259.  
  260.                 numFileNames++;
  261.  
  262.                 }       /* for (i = 1; i < argc; i++) */
  263.  
  264.         return FALSE;
  265. }
  266.  
  267.  
  268. static int GetDWord(char *Str, DWORD *pDW)
  269. {
  270.         char *pEnd;
  271.  
  272.         if (Str[0] == '=')
  273.                 Str++;
  274.  
  275.         *pDW = (DWORD)strtol(Str, &pEnd, 0);
  276.  
  277.         if (pEnd == Str)
  278.                 {
  279.                 printf("Invalid number \"%s\".\n"
  280.                            "  Use -? for help.\n", Str);
  281.                 return TRUE;
  282.                 }
  283.  
  284.         return FALSE;
  285. }
  286.  
  287. static int GetWord(char *Str, WORD *pWord)
  288. {
  289.         char *pEnd;
  290.  
  291.         if (Str[0] == '=')
  292.                 Str++;
  293.  
  294.         *pWord = (WORD)strtol(Str, &pEnd, 0);
  295.  
  296.         if (pEnd == Str)
  297.                 {
  298.                 printf("Invalid number \"%s\".\n"
  299.                            "  Use -? for help.\n", Str);
  300.                 return TRUE;
  301.                 }
  302.  
  303.         return FALSE;
  304. }
  305.  
  306.  
  307. static int CopyStringParam(char *dst, char *src, int maxlen)
  308. {
  309.         if (src[0] == '=')
  310.                 src++;
  311.  
  312.         if (strlen(src) == 0)
  313.                 {
  314.                 printf("Missing string\n"
  315.                         "  Use -? for help.\n");
  316.                 return TRUE;
  317.                 }
  318.  
  319.         dZ80_SafeStringCopy(dst, src, maxlen);
  320.         return FALSE;
  321. }
  322.  
  323.  
  324.  
  325.