home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / smapp100.zip / sm10.zip / smgprtlk.c < prev    next >
C/C++ Source or Header  |  2000-05-14  |  22KB  |  590 lines

  1. /* ------------------------------------------------------------------------
  2.  *
  3.  *        File: smgprtlk.c
  4.  *     Project: Source Mapper.
  5.  *     Created: April 7, 1992.
  6.  * Description: Parametertolker til SMG1's kommandolinjeversjon.
  7.  *
  8.  * Copyright (C) 2000 Leif-Erik Larsen.
  9.  * This file is part of the Source Mapper source package.
  10.  * Source Mapper is free software; you can redistribute it and/or modify
  11.  * it under the terms of the GNU General Public License as published
  12.  * by the Free Software Foundation, in version 2 as it comes in the
  13.  * "COPYING" file of the XWorkplace main distribution.
  14.  * This program is distributed in the hope that it will be useful,
  15.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.  * GNU General Public License for more details.
  18.  *
  19.  * ------------------------------------------------------------------------ */
  20.  
  21.  
  22.  
  23.  
  24. #include "smg.h"
  25.  
  26.  
  27.  
  28.  
  29. #define MAXOPTSW   MAXLSTLEN                 /* Bryterlengde. (SMGOPTIO.H) */
  30. #define MAXOPTNAME 4                         /* Maks lengde til bryternavn */
  31. #define MAXFULLOPT MAXOPTSW + MAXOPTNAME + 2 /* Både navn og valg, samt [] */
  32.  
  33.  
  34.  
  35.  
  36. int interpret_switch ( const char *sw, int *code, const char *legal )
  37. /* Opprettet: Torsdag 9. april 1992.
  38.    Parameter: "sw"    Brukeroppgitt bryterstilling (oppgitt mellom [ og ]).
  39.               "code"  Variabel som skal settes i henhold til bryterstilling.
  40.               "legal" Liste over lovlige karakterer til bryteren.
  41.    Retur    : E/O.
  42.    Beskriv  : Tolker kun det f¢rste tegnet i oppgitt bryterstilling.
  43.               Dersom strengen har fler enn ett tegn returneres 0.
  44.               Dersom strengen er tom returneres 1, men "code" forandres ikke.
  45.               Dersom det f¢rste tegnet ikke finnes i "legal" returneres 0.
  46. */
  47. {
  48.    if (!strchr (legal, *sw))
  49.       RETURN_ERR;                      /* Ukjent/ulovlig bryterstilling */
  50.  
  51.    switch (*sw)
  52.    {
  53.       case '0': *code = 0; return (OK);
  54.       case '1': *code = 1; return (OK);
  55.       case '2': *code = 2; return (OK);
  56.       case '3': *code = 3; return (OK);
  57.       case '4': *code = 4; return (OK);
  58.       case '5': *code = 5; return (OK);
  59.       case '-': *code = O_NO; return (OK);
  60.       case '+': *code = O_YES; return (OK);
  61.  
  62.       case 0:                       /* Hvis strengen/bryterstillingen er tom */
  63.            return (OK);             /* Fortsett uten videre */
  64.  
  65.       default:
  66.            RETURN_ERR;              /* Ukjent/ulovlig bryterstilling */
  67.    }
  68. } /* interpret_switch (); */
  69.  
  70.  
  71.  
  72.  
  73. int UseOptionsFile ( const char *path )
  74. /*
  75.     Function: Read and translate options from specified textfile.
  76.         Date: April, 1992. By LEL.
  77.    Interface: path = Path/name of options file to read.
  78.      Returns: E/O.
  79. */
  80. {
  81.    static is_here = 0;
  82.  
  83.    if (is_here == 1)
  84.       return (ERROR);
  85.  
  86.    is_here = 1;
  87.  
  88.    if (*path == 0)                     /* Hvis filnavn ikke er oppgitt */
  89.    {
  90.       if (!read_options (BigStr (2, fnames[DEFOPT_FNAME], fnames[SMGOPTI_EXT])))
  91.       {
  92.          is_here = 0;
  93.          RETURN_ERR;
  94.       }
  95.    }
  96.  
  97.    else
  98.    if (!IsExt (path))                  /* Hvis ikke noe etternavn */
  99.    {
  100.       if (!read_options (BigStr (2, path, fnames[SMGOPTI_EXT])))
  101.       {
  102.          is_here = 0;
  103.          RETURN_ERR;
  104.       }
  105.    }
  106.  
  107.    else
  108.    if (!read_options (path))
  109.    {
  110.       is_here = 0;
  111.       RETURN_ERR;
  112.    }
  113.  
  114.    is_here = 0;
  115.  
  116.    return (OK);
  117. } /* UseOptionsFile (); */
  118.  
  119.  
  120.  
  121.  
  122. int get_PT_macro ( const char *name )
  123. /* Opprettet: Tirsdag 7. april 1992.
  124.    Parameter: "name" Navn til ParameterTabell-makro.
  125.    Retur    : Tallkoden til parameterbryter-navn. "PT_ILLEGAL" hvis ulovlig.
  126.    Beskriv  : Finner og returnerer aksess-koden til oppgitt
  127.               parameterbryter-navn.
  128. */
  129. {
  130.    /* Koden til f¢rste elementet i "access_ptbl"-makrotabell */
  131.    int c1 = -1;
  132.  
  133.    /* S¢k etter aktuell makro, returner kode hvis funnet */
  134.    while (++c1 <= PT_MAXNR)
  135.    {
  136.       if (strcmp (ptbl[c1], name) == 0)
  137.          return c1;
  138.    }
  139.  
  140.    /* Kode for at oppgitt parameterbryter-navn ikke finnes i navn-tabellen */
  141.    return PT_ILLEGAL;
  142. } /* get_PT_macro (); */
  143.  
  144.  
  145.  
  146.  
  147. int param_getnext ( int nr, int maxlen, char *dest, char *source )
  148. /* Opprettet: Torsdag 4. februar 1993.
  149.    Parameter: "nr"     Nummer til parameter som skal leses (1..).
  150.               "maxlen" Maks antall tegn som kan lagrest i "dest".
  151.               "dest"   Buffer for lagring av lest parameter.
  152.               "source" Kilde, hvorfra aktuell parameter skal leses.
  153.    Retur    : E/O.
  154.    Beskriv  : Leser oppgitt parameter fra streng med flere parametere.
  155.               Forskjellige parametere skilles etter f¢lgende m¢nster:
  156.  
  157.               Eksempel ("source"):
  158.               "Dette er [+] strengen[Test 1 2  3] med flere    parametere."
  159.  
  160.               Tolkes som ("dest"):
  161.               p1: "Dette"
  162.               p2: "er [+]"
  163.               p3: "strengen[Test 1 2  3]"
  164.               p4: "med"
  165.               p5: "flere"
  166.               p6: "parametere."
  167. */
  168. {
  169.    int   c1    = 0;
  170.    int   len   = 0;
  171.    char *point = source;
  172.  
  173.    *dest = '\0';
  174.  
  175.    while (c1++ < nr)
  176.    {
  177.       /* Hopp over alle innledende hvite tegn til delparameter: */
  178.       while (*point && strchr (WHITECHR, *point))
  179.          point++;
  180.  
  181.       if (*point == '\0')
  182.          return (ERROR);
  183.  
  184.       /* Hvis aktiv delparameter har et tilh¢rende hakeparentes-sett: */
  185.       if (param_ishook (point) == YES)
  186.       {
  187.          while (*point)
  188.          {
  189.             if (c1 == nr)
  190.                if (++len < maxlen - 1)
  191.                   *dest++ = *point;
  192.  
  193.             if (*point++ == ']')
  194.                break;
  195.          }
  196.          *dest = '\0';
  197.       }
  198.  
  199.       /* Aktiv delparameter har ingen tilh¢rende hakeparentes-sett: */
  200.       else
  201.       {
  202.          while (*point && !strchr (WHITECHR, *point))
  203.          {
  204.             if (c1 == nr)
  205.                if (++len < maxlen)
  206.                   *dest++ = *point;
  207.             point++;
  208.          }
  209.          *dest = '\0';
  210.       }
  211.    }
  212.  
  213.    return (OK);
  214. } /* param_getnext (); */
  215.  
  216.  
  217.  
  218.  
  219. int param_ishook ( const char *point )
  220. /* Opprettet: Torsdag 4. februar 1993.
  221.    Parameter: "point" Streng som skal testes.
  222.    Retur    : YES hvis f¢rstkommende ord i "point" har et tilh¢rende
  223.               hakeparentes-sett. Ellers NO.
  224.    Beskriv  : Returnerer YES/NO etter f¢lgende m¢nster:
  225.  
  226.               Eksempel ("point"):
  227.               "dette er" ==> NO.
  228.               "en  [+]"  ==> YES.
  229.               "lang"     ==> NO.
  230.               "test[-]   ==> YES.
  231. */
  232. {
  233.    /* Hopp over alle tegn fram til hvitt tegn eller fram til start
  234.       av hakeparentes-sett: */
  235.    while (*point && !strchr (WHITECHR, *point) && *point != '[')
  236.       point++;
  237.  
  238.    /* Hopp over hvite tegn mellom ord og eventuelt hakeparentes-sett: */
  239.    while (*point && strchr (WHITECHR, *point))
  240.       point++;
  241.  
  242.    /* Sjekk om tillh¢rende hakeparentes-sett: */
  243.    if (*point == '[')
  244.       return (YES);
  245.  
  246.    return (NO);
  247. } /* param_ishook (); */
  248.  
  249.  
  250.  
  251.  
  252. int interpret_parameters ( char *param, int iEWarn )
  253. /* Opprettet: Tirsdag 7. april 1992.
  254.    Parameter: "par"    Brukeroppgitte parametere. Space skiller ord/uttrykk.
  255.               "iEWarn" TRUE to enable warning message in case we find
  256.                        an unknown option. This argument must be TRUE if
  257.                        we are about to interpret parameters from an options-
  258.                        file. Else this argument must be FALSE.
  259.    Retur    : E/O.
  260.    Beskriv  : Tolker brukeroppgitte parametere. Parameterstrengen skal
  261.               utgj¢re alle brukeroppgitte parametere, samlet til én streng.
  262. */
  263. {
  264.    int  c1 = 1;                        /* Counter 1 */
  265.    int  tabw;                          /* Used when option sets with of tabs */
  266.    int  ok;                            /* Mellomlager av returkode */
  267.    int  optcode;                       /* OPTionCODE */
  268.    int  wildchr = FALSE;               /* TRUE hvis et filnavn med *,? */
  269.    static char fullopt[MAXFULLOPT + 1];/* FULL-OPTion */
  270.    static char optname[MAXOPTNAME + 1];/* OPTion-NAME */
  271.    static char optsw  [MAXOPTSW   + 1];/* OPTion-SWitch */
  272.  
  273.    prjfeTYPE fdata;                    /* Ved lagring av filnavn til prj-fil */
  274.  
  275.    while (param_getnext (c1++, MAXFULLOPT, fullopt, param))
  276.    {
  277.       if (!strchr(fullopt, '[') &&     /* Hvis aktivt element er et filnavn */
  278.           fullopt[0])                  /* Bare hvis filnavn ikke er tomt */
  279.       {
  280.          /* Sjekk at ikke det er oppgitt filnavn med jokertegn: */
  281.          if (wildchr == TRUE)
  282.          {
  283.             /* Kan bare oppgi én kildefil hvis noen har jokertegn! */
  284.             RETERR (18, NULL);
  285.          }
  286.  
  287.          ResetPrjFETYPE (&fdata);
  288.  
  289.          if (IsWild (fullopt))
  290.             wildchr = TRUE;            /* Filnavn med jokertegn er inkludert */
  291.  
  292.          /* Lagre navn til kildefil i prosjektelement: */
  293.          strcpy (fdata.name, fullopt);
  294.  
  295.          /* Legg til etternavn, dersom etternavn ikke er bestemt: */
  296.          if (!IsExt (fdata.name) &&
  297.              strlen (fdata.name) < MAXPATH - strlen (fnames[CSOURCE_EXT]))
  298.          {
  299.             strcat (fdata.name, fnames[CSOURCE_EXT]);
  300.          }
  301.  
  302.          /* Lagre navn til kildefil i prj-fil: */
  303.          if (!AddFDataToPrj (&fdata))
  304.             RETURN_ERR;
  305.       }
  306.  
  307.       else
  308.       {
  309.          StrPart (1, MAXOPTNAME, optname, fullopt, " \t[");
  310.          StrPart (2, MAXOPTSW, optsw, fullopt, "[]");
  311.          optcode = get_PT_macro (optname);
  312.  
  313.          ok = OK;
  314.  
  315.          switch (optcode)
  316.          {
  317.             /*---------------------------------------------------------------*/
  318.             /* Totalinfo: Include Total Information */
  319.             case PT_iti : ok = interpret_switch (optsw, &o_totinfo.incl, "-+"); break;
  320.  
  321.             /* Totalinfo: View total number of lines */
  322.             case PT_ctl : ok = interpret_switch (optsw, &o_totinfo.lin_tot, "-+"); break;
  323.  
  324.             /* Totalinfo: View total number of empty lines */
  325.             case PT_cel : ok = interpret_switch (optsw, &o_totinfo.lin_emp, "-+"); break;
  326.  
  327.             /* Totalinfo: View total number of comment-lines */
  328.             case PT_coc : ok = interpret_switch (optsw, &o_totinfo.lin_com, "-+"); break;
  329.  
  330.             /* Totalinfo: View total number of lines with code */
  331.             case PT_clc : ok = interpret_switch (optsw, &o_totinfo.lin_cod, "-+"); break;
  332.  
  333.             /* Totalinfo: View total number of functions */
  334.             case PT_cfu : ok = interpret_switch (optsw, &o_totinfo.func, "-+"); break;
  335.  
  336.             /* Totalinfo: View total number of blocks of comments */
  337.             case PT_cco : ok = interpret_switch (optsw, &o_totinfo.com, "-+"); break;
  338.  
  339.             /*---------------------------------------------------------------*/
  340.             /* Functionreg: Include register of functions */
  341.             case PT_ifr : ok = interpret_switch (optsw, &o_funcreg.incl, "-+"); break;
  342.  
  343.             /* Functionreg: Sorting method */
  344.             case PT_fso : ok = interpret_switch (optsw, &o_funcreg.sort, "12"); break;
  345.  
  346.             /*---------------------------------------------------------------*/
  347.             /* Functioncalls: Include list of functioncalls */
  348.             case PT_ilf : ok = interpret_switch (optsw, &o_funcall.incl, "-+"); break;
  349.  
  350.             /* Functioncalls: Selective list */
  351.             case PT_slf : if (strlen (optsw) > MAXLSTLEN)
  352.                           {
  353.                              ok = ERROR;
  354.                              break;
  355.                           }
  356.                           strcpy (o_funcall.list, optsw);
  357.                           if (optsw[0])
  358.                              o_funcall.sel = O_YES;
  359.                           else
  360.                              o_funcall.sel = O_NO;
  361.                           break;
  362.  
  363.             /* Functioncalls: Rising line numbers */
  364.             case PT_fln : ok = interpret_switch (optsw, &o_funcall.riselnr, "-+"); break;
  365.  
  366.             /*---------------------------------------------------------------*/
  367.             /* Identifiers: Include list of identifiers */
  368.             case PT_iil : ok = interpret_switch (optsw, &o_idlist.incl, "-+"); break;
  369.  
  370.             /* Identifiers: Selective list */
  371.             case PT_sli : if (strlen (optsw) > MAXLSTLEN)
  372.                           {
  373.                              ok = ERROR;
  374.                              break;
  375.                           }
  376.                           strcpy (o_idlist.list, optsw);
  377.                           if (optsw[0])
  378.                              o_idlist.sel = O_YES;
  379.                           else
  380.                              o_idlist.sel = O_NO;
  381.                           break;
  382.  
  383.             /* Identifiers: Rising line numbers */
  384.             case PT_iln : ok = interpret_switch (optsw, &o_idlist.riselnr, "-+"); break;
  385.  
  386.             /*---------------------------------------------------------------*/
  387.             /* Call sequence: Include list of call sequences */
  388.             case PT_csi : ok = interpret_switch (optsw, &o_flow.incl, "-+"); break;
  389.  
  390.             /* Call sequence: Include external functions in list of call sequences */
  391.             case PT_cie : ok = interpret_switch (optsw, &o_flow.iIncExternals, "-+"); break;
  392.  
  393.             /* Call sequence: Use graphicals characters */
  394.             case PT_csg : ok = interpret_switch (optsw, &o_flow.graph, "-+"); break;
  395.  
  396.             /* Call sequence: Format (1=List, 2=Flowchart) */
  397.             case PT_csf : ok = interpret_switch (optsw, &o_flow.format, "12"); break;
  398.  
  399.             /* Call sequence: Width of indents */
  400.             case PT_cwi : tabw = atoi (optsw); /* Convert to integer         */
  401.                           if (tabw < 1 || tabw > 32)
  402.                           {
  403.                              ok = ERROR;
  404.                              break;
  405.                           }
  406.                           o_flow.indent = tabw;
  407.                           break;
  408.  
  409.             /* Call sequence: Include indexregister */
  410.             case PT_cir : ok = interpret_switch (optsw, &o_flow.index, "-+"); break;
  411.  
  412.             /* Call sequence: Default top level function */
  413.             case PT_cdt : if (strlen (optsw) > MAXFUNCN)
  414.                           {
  415.                              ok = ERROR;
  416.                              break;
  417.                           }
  418.                           strcpy (o_flow.deftoplev, optsw);
  419.                           break;
  420.  
  421.             /*---------------------------------------------------------------*/
  422.             /* Lineinfo: Include source/lineinfo */
  423.             case PT_ili : ok = interpret_switch (optsw, &o_lineinfo.incl, "-+"); break;
  424.  
  425.             /* Lineinfo: View local line numbers */
  426.             case PT_lll : ok = interpret_switch (optsw, &o_lineinfo.r_llin, "-+"); break;
  427.  
  428.             /* Lineinfo: View level of blocks */
  429.             case PT_rbi : ok = interpret_switch (optsw, &o_lineinfo.r_bloc, "-+"); break;
  430.  
  431.             /* Lineinfo: View mark of comment-lines */
  432.             case PT_lcl : ok = interpret_switch (optsw, &o_lineinfo.r_coml, "-+"); break;
  433.  
  434.             /*---------------------------------------------------------------*/
  435.             /* Functioninfo: Include info of functions */
  436.             case PT_lfi : ok = interpret_switch (optsw, &o_lineinfo.r_func, "-+"); break;
  437.  
  438.             /* Functioninfo: View number of lines in function */
  439.             case PT_LLF : ok = interpret_switch (optsw, &o_lineinfo.c_ltot, "-+"); break;
  440.  
  441.             /* Functioninfo: View number of empty lines in function */
  442.             case PT_LEF : ok = interpret_switch (optsw, &o_lineinfo.c_empl, "-+"); break;
  443.  
  444.             /* Functioninfo: View number of comment-lines in function */
  445.             case PT_LCF : ok = interpret_switch (optsw, &o_lineinfo.c_coml, "-+"); break;
  446.  
  447.             /* Functioninfo: View number of lines with code in function */
  448.             case PT_LCO : ok = interpret_switch (optsw, &o_lineinfo.c_lcod, "-+"); break;
  449.  
  450.             /* Functioninfo: View number of comment-blocks in function */
  451.             case PT_LCC : ok = interpret_switch (optsw, &o_lineinfo.c_com, "-+"); break;
  452.  
  453.             /* Functioninfo: Include list of callers */
  454.             case PT_LLC : ok = interpret_switch (optsw, &o_lineinfo.calist, "-+"); break;
  455.  
  456.             /*---------------------------------------------------------------*/
  457.             /* Various: New page string */
  458.             case PT_NPs : if (strlen (optsw) > MAXNPSTRL - 1)
  459.                           {
  460.                              ok = ERROR;
  461.                              break;
  462.                           }
  463.                           strcpy (o_various.newpag, optsw);
  464.                           if (optsw[0])
  465.                              o_various.np_str = O_YES;
  466.                           else
  467.                              o_various.np_str = O_NO;
  468.                           break;
  469.  
  470.             /* Various: New page when new page string */
  471.             case PT_NPS : ok = interpret_switch (optsw, &o_various.np_str, "-+"); break;
  472.  
  473.             /* Various: New page on every function */
  474.             case PT_NFU : ok = interpret_switch (optsw, &o_various.np_fun, "-+"); break;
  475.  
  476.             /* Various: New page between every map section */
  477.             case PT_NFI : ok = interpret_switch (optsw, &o_various.np_sect, "-+"); break;
  478.  
  479.             /* Various: Column separator */
  480.             case PT_cse : ok = interpret_switch (optsw, &o_various.column, "12"); break;
  481.  
  482.             /* Various: Delete objectfiles after use */
  483.             case PT_dtu : ok = interpret_switch (optsw, &o_various.del, "-+"); break;
  484.  
  485.             /* Various: Generate comment-blocks around info */
  486.             case PT_gcb : ok = interpret_switch (optsw, &o_various.gencom, "-+"); break;
  487.  
  488.             /* Various: With of tabulator */
  489.             case PT_tab : tabw = atoi (optsw); /* Convert to integer         */
  490.                           if (tabw < 1 || tabw > 32)
  491.                           {
  492.                              ok = ERROR;
  493.                              break;
  494.                           }
  495.                           o_various.twidth = tabw;
  496.                           break;
  497.  
  498.             /* Various: Display information on screen */
  499.             case PT_dis : ok = interpret_switch (optsw, &o_various.iShowInfo, "0123"); break;
  500.  
  501.             /*---------------------------------------------------------------*/
  502.             /* Generate: Generate what (All/Map/Objectfiles) */
  503.             case PT_gen : ok = interpret_switch (optsw, &o_generate.gen, "123"); break;
  504.  
  505.             /* Generate: Method (Link/Make/Build) */
  506.             case PT_met : ok = interpret_switch (optsw, &o_generate.met, "123"); break;
  507.  
  508.             /* Generate: Path to objectfiles */
  509.             case PT_pof : if (strlen (optsw) > MAXDIR)
  510.                           {
  511.                              ok = ERROR;
  512.                              break;
  513.                           }
  514.                           strcpy (o_generate.obj, optsw);
  515.                           Slash  (o_generate.obj);
  516.                           break;
  517.  
  518.             /* Generate: Path to mapfile */
  519.             case PT_pmf : if (strlen (optsw) > MAXPATH)
  520.                           {
  521.                              ok = ERROR;
  522.                              break;
  523.                           }
  524.                           strcpy (o_generate.map, optsw);
  525.                           Slash  (o_generate.map);
  526.                           break;
  527.  
  528.             /* Generate: Path to temporary files */
  529.             case PT_ptf : if (strlen (optsw) > MAXDIR)
  530.                           {
  531.                              ok = ERROR;
  532.                              break;
  533.                           }
  534.                           strcpy (o_generate.tmp, optsw);
  535.                           Slash  (o_generate.tmp);
  536.                           break;
  537.  
  538.             /* Generate: Use projectfile */
  539.             case PT_upf : ok = OK; break;
  540.  
  541.             /*---------------------------------------------------------------*/
  542.             /* Direct options: Use option file */
  543.             case PT_uof : ok = UseOptionsFile (optsw); break;
  544.  
  545.             /* Direct options: Write options to textfile */
  546.             case PT_wof : if (!optsw[0])        /* If filename not specified */
  547.                           {
  548.                              if (!save_options (BigStr (2, fnames[DEFOPT_FNAME], fnames[SMGOPTI_EXT])))
  549.                                 ok = ERROR;
  550.                              break;
  551.                           }
  552.                           if (!IsExt (optsw))         /* If no extension */
  553.                           {
  554.                              if (!save_options (BigStr (2, optsw, fnames[SMGOPTI_EXT])))
  555.                                 ok = ERROR;
  556.                              break;
  557.                           }
  558.                           if (!save_options (optsw))
  559.                              ok = ERROR;
  560.                           break;
  561.  
  562.             /* Direct options: Reset options to default */
  563.             case PT_res : if (!SetDefaultOptions ())
  564.                              RETURN_ERR;
  565.                           break;
  566.  
  567.             /* Direct options: Help user */
  568.             case PT_hlp : SMHelpCmd (optsw);
  569.                           break;
  570.  
  571.             /* Ulovlig bryternavn, bare hvis bryternavn ikke er tomt: */
  572.             default     : if (optname[0])
  573.                           {
  574.                              if (iEWarn)
  575.                                 DoWarning (_StrErrUnknownOption, fullopt);
  576.                              else
  577.                                 RETERR (19, fullopt); /* Unknown option or switch! */
  578.                           }
  579.          }
  580.  
  581.          if (!ok) /* Sjekk om feil ved tolking av parameter */
  582.             RETERR (17, fullopt); /* Unknown or illegal argument of option! */
  583.       }
  584.    }
  585.  
  586.    return (OK);
  587. } /* interpret_parameters (); */
  588.  
  589.  
  590.