home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 10 Tools
/
10-Tools.zip
/
smapp100.zip
/
sm10.zip
/
smgprtlk.c
< prev
next >
Wrap
C/C++ Source or Header
|
2000-05-14
|
22KB
|
590 lines
/* ------------------------------------------------------------------------
*
* File: smgprtlk.c
* Project: Source Mapper.
* Created: April 7, 1992.
* Description: Parametertolker til SMG1's kommandolinjeversjon.
*
* Copyright (C) 2000 Leif-Erik Larsen.
* This file is part of the Source Mapper source package.
* Source Mapper is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published
* by the Free Software Foundation, in version 2 as it comes in the
* "COPYING" file of the XWorkplace main distribution.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* ------------------------------------------------------------------------ */
#include "smg.h"
#define MAXOPTSW MAXLSTLEN /* Bryterlengde. (SMGOPTIO.H) */
#define MAXOPTNAME 4 /* Maks lengde til bryternavn */
#define MAXFULLOPT MAXOPTSW + MAXOPTNAME + 2 /* Både navn og valg, samt [] */
int interpret_switch ( const char *sw, int *code, const char *legal )
/* Opprettet: Torsdag 9. april 1992.
Parameter: "sw" Brukeroppgitt bryterstilling (oppgitt mellom [ og ]).
"code" Variabel som skal settes i henhold til bryterstilling.
"legal" Liste over lovlige karakterer til bryteren.
Retur : E/O.
Beskriv : Tolker kun det f¢rste tegnet i oppgitt bryterstilling.
Dersom strengen har fler enn ett tegn returneres 0.
Dersom strengen er tom returneres 1, men "code" forandres ikke.
Dersom det f¢rste tegnet ikke finnes i "legal" returneres 0.
*/
{
if (!strchr (legal, *sw))
RETURN_ERR; /* Ukjent/ulovlig bryterstilling */
switch (*sw)
{
case '0': *code = 0; return (OK);
case '1': *code = 1; return (OK);
case '2': *code = 2; return (OK);
case '3': *code = 3; return (OK);
case '4': *code = 4; return (OK);
case '5': *code = 5; return (OK);
case '-': *code = O_NO; return (OK);
case '+': *code = O_YES; return (OK);
case 0: /* Hvis strengen/bryterstillingen er tom */
return (OK); /* Fortsett uten videre */
default:
RETURN_ERR; /* Ukjent/ulovlig bryterstilling */
}
} /* interpret_switch (); */
int UseOptionsFile ( const char *path )
/*
Function: Read and translate options from specified textfile.
Date: April, 1992. By LEL.
Interface: path = Path/name of options file to read.
Returns: E/O.
*/
{
static is_here = 0;
if (is_here == 1)
return (ERROR);
is_here = 1;
if (*path == 0) /* Hvis filnavn ikke er oppgitt */
{
if (!read_options (BigStr (2, fnames[DEFOPT_FNAME], fnames[SMGOPTI_EXT])))
{
is_here = 0;
RETURN_ERR;
}
}
else
if (!IsExt (path)) /* Hvis ikke noe etternavn */
{
if (!read_options (BigStr (2, path, fnames[SMGOPTI_EXT])))
{
is_here = 0;
RETURN_ERR;
}
}
else
if (!read_options (path))
{
is_here = 0;
RETURN_ERR;
}
is_here = 0;
return (OK);
} /* UseOptionsFile (); */
int get_PT_macro ( const char *name )
/* Opprettet: Tirsdag 7. april 1992.
Parameter: "name" Navn til ParameterTabell-makro.
Retur : Tallkoden til parameterbryter-navn. "PT_ILLEGAL" hvis ulovlig.
Beskriv : Finner og returnerer aksess-koden til oppgitt
parameterbryter-navn.
*/
{
/* Koden til f¢rste elementet i "access_ptbl"-makrotabell */
int c1 = -1;
/* S¢k etter aktuell makro, returner kode hvis funnet */
while (++c1 <= PT_MAXNR)
{
if (strcmp (ptbl[c1], name) == 0)
return c1;
}
/* Kode for at oppgitt parameterbryter-navn ikke finnes i navn-tabellen */
return PT_ILLEGAL;
} /* get_PT_macro (); */
int param_getnext ( int nr, int maxlen, char *dest, char *source )
/* Opprettet: Torsdag 4. februar 1993.
Parameter: "nr" Nummer til parameter som skal leses (1..).
"maxlen" Maks antall tegn som kan lagrest i "dest".
"dest" Buffer for lagring av lest parameter.
"source" Kilde, hvorfra aktuell parameter skal leses.
Retur : E/O.
Beskriv : Leser oppgitt parameter fra streng med flere parametere.
Forskjellige parametere skilles etter f¢lgende m¢nster:
Eksempel ("source"):
"Dette er [+] strengen[Test 1 2 3] med flere parametere."
Tolkes som ("dest"):
p1: "Dette"
p2: "er [+]"
p3: "strengen[Test 1 2 3]"
p4: "med"
p5: "flere"
p6: "parametere."
*/
{
int c1 = 0;
int len = 0;
char *point = source;
*dest = '\0';
while (c1++ < nr)
{
/* Hopp over alle innledende hvite tegn til delparameter: */
while (*point && strchr (WHITECHR, *point))
point++;
if (*point == '\0')
return (ERROR);
/* Hvis aktiv delparameter har et tilh¢rende hakeparentes-sett: */
if (param_ishook (point) == YES)
{
while (*point)
{
if (c1 == nr)
if (++len < maxlen - 1)
*dest++ = *point;
if (*point++ == ']')
break;
}
*dest = '\0';
}
/* Aktiv delparameter har ingen tilh¢rende hakeparentes-sett: */
else
{
while (*point && !strchr (WHITECHR, *point))
{
if (c1 == nr)
if (++len < maxlen)
*dest++ = *point;
point++;
}
*dest = '\0';
}
}
return (OK);
} /* param_getnext (); */
int param_ishook ( const char *point )
/* Opprettet: Torsdag 4. februar 1993.
Parameter: "point" Streng som skal testes.
Retur : YES hvis f¢rstkommende ord i "point" har et tilh¢rende
hakeparentes-sett. Ellers NO.
Beskriv : Returnerer YES/NO etter f¢lgende m¢nster:
Eksempel ("point"):
"dette er" ==> NO.
"en [+]" ==> YES.
"lang" ==> NO.
"test[-] ==> YES.
*/
{
/* Hopp over alle tegn fram til hvitt tegn eller fram til start
av hakeparentes-sett: */
while (*point && !strchr (WHITECHR, *point) && *point != '[')
point++;
/* Hopp over hvite tegn mellom ord og eventuelt hakeparentes-sett: */
while (*point && strchr (WHITECHR, *point))
point++;
/* Sjekk om tillh¢rende hakeparentes-sett: */
if (*point == '[')
return (YES);
return (NO);
} /* param_ishook (); */
int interpret_parameters ( char *param, int iEWarn )
/* Opprettet: Tirsdag 7. april 1992.
Parameter: "par" Brukeroppgitte parametere. Space skiller ord/uttrykk.
"iEWarn" TRUE to enable warning message in case we find
an unknown option. This argument must be TRUE if
we are about to interpret parameters from an options-
file. Else this argument must be FALSE.
Retur : E/O.
Beskriv : Tolker brukeroppgitte parametere. Parameterstrengen skal
utgj¢re alle brukeroppgitte parametere, samlet til én streng.
*/
{
int c1 = 1; /* Counter 1 */
int tabw; /* Used when option sets with of tabs */
int ok; /* Mellomlager av returkode */
int optcode; /* OPTionCODE */
int wildchr = FALSE; /* TRUE hvis et filnavn med *,? */
static char fullopt[MAXFULLOPT + 1];/* FULL-OPTion */
static char optname[MAXOPTNAME + 1];/* OPTion-NAME */
static char optsw [MAXOPTSW + 1];/* OPTion-SWitch */
prjfeTYPE fdata; /* Ved lagring av filnavn til prj-fil */
while (param_getnext (c1++, MAXFULLOPT, fullopt, param))
{
if (!strchr(fullopt, '[') && /* Hvis aktivt element er et filnavn */
fullopt[0]) /* Bare hvis filnavn ikke er tomt */
{
/* Sjekk at ikke det er oppgitt filnavn med jokertegn: */
if (wildchr == TRUE)
{
/* Kan bare oppgi én kildefil hvis noen har jokertegn! */
RETERR (18, NULL);
}
ResetPrjFETYPE (&fdata);
if (IsWild (fullopt))
wildchr = TRUE; /* Filnavn med jokertegn er inkludert */
/* Lagre navn til kildefil i prosjektelement: */
strcpy (fdata.name, fullopt);
/* Legg til etternavn, dersom etternavn ikke er bestemt: */
if (!IsExt (fdata.name) &&
strlen (fdata.name) < MAXPATH - strlen (fnames[CSOURCE_EXT]))
{
strcat (fdata.name, fnames[CSOURCE_EXT]);
}
/* Lagre navn til kildefil i prj-fil: */
if (!AddFDataToPrj (&fdata))
RETURN_ERR;
}
else
{
StrPart (1, MAXOPTNAME, optname, fullopt, " \t[");
StrPart (2, MAXOPTSW, optsw, fullopt, "[]");
optcode = get_PT_macro (optname);
ok = OK;
switch (optcode)
{
/*---------------------------------------------------------------*/
/* Totalinfo: Include Total Information */
case PT_iti : ok = interpret_switch (optsw, &o_totinfo.incl, "-+"); break;
/* Totalinfo: View total number of lines */
case PT_ctl : ok = interpret_switch (optsw, &o_totinfo.lin_tot, "-+"); break;
/* Totalinfo: View total number of empty lines */
case PT_cel : ok = interpret_switch (optsw, &o_totinfo.lin_emp, "-+"); break;
/* Totalinfo: View total number of comment-lines */
case PT_coc : ok = interpret_switch (optsw, &o_totinfo.lin_com, "-+"); break;
/* Totalinfo: View total number of lines with code */
case PT_clc : ok = interpret_switch (optsw, &o_totinfo.lin_cod, "-+"); break;
/* Totalinfo: View total number of functions */
case PT_cfu : ok = interpret_switch (optsw, &o_totinfo.func, "-+"); break;
/* Totalinfo: View total number of blocks of comments */
case PT_cco : ok = interpret_switch (optsw, &o_totinfo.com, "-+"); break;
/*---------------------------------------------------------------*/
/* Functionreg: Include register of functions */
case PT_ifr : ok = interpret_switch (optsw, &o_funcreg.incl, "-+"); break;
/* Functionreg: Sorting method */
case PT_fso : ok = interpret_switch (optsw, &o_funcreg.sort, "12"); break;
/*---------------------------------------------------------------*/
/* Functioncalls: Include list of functioncalls */
case PT_ilf : ok = interpret_switch (optsw, &o_funcall.incl, "-+"); break;
/* Functioncalls: Selective list */
case PT_slf : if (strlen (optsw) > MAXLSTLEN)
{
ok = ERROR;
break;
}
strcpy (o_funcall.list, optsw);
if (optsw[0])
o_funcall.sel = O_YES;
else
o_funcall.sel = O_NO;
break;
/* Functioncalls: Rising line numbers */
case PT_fln : ok = interpret_switch (optsw, &o_funcall.riselnr, "-+"); break;
/*---------------------------------------------------------------*/
/* Identifiers: Include list of identifiers */
case PT_iil : ok = interpret_switch (optsw, &o_idlist.incl, "-+"); break;
/* Identifiers: Selective list */
case PT_sli : if (strlen (optsw) > MAXLSTLEN)
{
ok = ERROR;
break;
}
strcpy (o_idlist.list, optsw);
if (optsw[0])
o_idlist.sel = O_YES;
else
o_idlist.sel = O_NO;
break;
/* Identifiers: Rising line numbers */
case PT_iln : ok = interpret_switch (optsw, &o_idlist.riselnr, "-+"); break;
/*---------------------------------------------------------------*/
/* Call sequence: Include list of call sequences */
case PT_csi : ok = interpret_switch (optsw, &o_flow.incl, "-+"); break;
/* Call sequence: Include external functions in list of call sequences */
case PT_cie : ok = interpret_switch (optsw, &o_flow.iIncExternals, "-+"); break;
/* Call sequence: Use graphicals characters */
case PT_csg : ok = interpret_switch (optsw, &o_flow.graph, "-+"); break;
/* Call sequence: Format (1=List, 2=Flowchart) */
case PT_csf : ok = interpret_switch (optsw, &o_flow.format, "12"); break;
/* Call sequence: Width of indents */
case PT_cwi : tabw = atoi (optsw); /* Convert to integer */
if (tabw < 1 || tabw > 32)
{
ok = ERROR;
break;
}
o_flow.indent = tabw;
break;
/* Call sequence: Include indexregister */
case PT_cir : ok = interpret_switch (optsw, &o_flow.index, "-+"); break;
/* Call sequence: Default top level function */
case PT_cdt : if (strlen (optsw) > MAXFUNCN)
{
ok = ERROR;
break;
}
strcpy (o_flow.deftoplev, optsw);
break;
/*---------------------------------------------------------------*/
/* Lineinfo: Include source/lineinfo */
case PT_ili : ok = interpret_switch (optsw, &o_lineinfo.incl, "-+"); break;
/* Lineinfo: View local line numbers */
case PT_lll : ok = interpret_switch (optsw, &o_lineinfo.r_llin, "-+"); break;
/* Lineinfo: View level of blocks */
case PT_rbi : ok = interpret_switch (optsw, &o_lineinfo.r_bloc, "-+"); break;
/* Lineinfo: View mark of comment-lines */
case PT_lcl : ok = interpret_switch (optsw, &o_lineinfo.r_coml, "-+"); break;
/*---------------------------------------------------------------*/
/* Functioninfo: Include info of functions */
case PT_lfi : ok = interpret_switch (optsw, &o_lineinfo.r_func, "-+"); break;
/* Functioninfo: View number of lines in function */
case PT_LLF : ok = interpret_switch (optsw, &o_lineinfo.c_ltot, "-+"); break;
/* Functioninfo: View number of empty lines in function */
case PT_LEF : ok = interpret_switch (optsw, &o_lineinfo.c_empl, "-+"); break;
/* Functioninfo: View number of comment-lines in function */
case PT_LCF : ok = interpret_switch (optsw, &o_lineinfo.c_coml, "-+"); break;
/* Functioninfo: View number of lines with code in function */
case PT_LCO : ok = interpret_switch (optsw, &o_lineinfo.c_lcod, "-+"); break;
/* Functioninfo: View number of comment-blocks in function */
case PT_LCC : ok = interpret_switch (optsw, &o_lineinfo.c_com, "-+"); break;
/* Functioninfo: Include list of callers */
case PT_LLC : ok = interpret_switch (optsw, &o_lineinfo.calist, "-+"); break;
/*---------------------------------------------------------------*/
/* Various: New page string */
case PT_NPs : if (strlen (optsw) > MAXNPSTRL - 1)
{
ok = ERROR;
break;
}
strcpy (o_various.newpag, optsw);
if (optsw[0])
o_various.np_str = O_YES;
else
o_various.np_str = O_NO;
break;
/* Various: New page when new page string */
case PT_NPS : ok = interpret_switch (optsw, &o_various.np_str, "-+"); break;
/* Various: New page on every function */
case PT_NFU : ok = interpret_switch (optsw, &o_various.np_fun, "-+"); break;
/* Various: New page between every map section */
case PT_NFI : ok = interpret_switch (optsw, &o_various.np_sect, "-+"); break;
/* Various: Column separator */
case PT_cse : ok = interpret_switch (optsw, &o_various.column, "12"); break;
/* Various: Delete objectfiles after use */
case PT_dtu : ok = interpret_switch (optsw, &o_various.del, "-+"); break;
/* Various: Generate comment-blocks around info */
case PT_gcb : ok = interpret_switch (optsw, &o_various.gencom, "-+"); break;
/* Various: With of tabulator */
case PT_tab : tabw = atoi (optsw); /* Convert to integer */
if (tabw < 1 || tabw > 32)
{
ok = ERROR;
break;
}
o_various.twidth = tabw;
break;
/* Various: Display information on screen */
case PT_dis : ok = interpret_switch (optsw, &o_various.iShowInfo, "0123"); break;
/*---------------------------------------------------------------*/
/* Generate: Generate what (All/Map/Objectfiles) */
case PT_gen : ok = interpret_switch (optsw, &o_generate.gen, "123"); break;
/* Generate: Method (Link/Make/Build) */
case PT_met : ok = interpret_switch (optsw, &o_generate.met, "123"); break;
/* Generate: Path to objectfiles */
case PT_pof : if (strlen (optsw) > MAXDIR)
{
ok = ERROR;
break;
}
strcpy (o_generate.obj, optsw);
Slash (o_generate.obj);
break;
/* Generate: Path to mapfile */
case PT_pmf : if (strlen (optsw) > MAXPATH)
{
ok = ERROR;
break;
}
strcpy (o_generate.map, optsw);
Slash (o_generate.map);
break;
/* Generate: Path to temporary files */
case PT_ptf : if (strlen (optsw) > MAXDIR)
{
ok = ERROR;
break;
}
strcpy (o_generate.tmp, optsw);
Slash (o_generate.tmp);
break;
/* Generate: Use projectfile */
case PT_upf : ok = OK; break;
/*---------------------------------------------------------------*/
/* Direct options: Use option file */
case PT_uof : ok = UseOptionsFile (optsw); break;
/* Direct options: Write options to textfile */
case PT_wof : if (!optsw[0]) /* If filename not specified */
{
if (!save_options (BigStr (2, fnames[DEFOPT_FNAME], fnames[SMGOPTI_EXT])))
ok = ERROR;
break;
}
if (!IsExt (optsw)) /* If no extension */
{
if (!save_options (BigStr (2, optsw, fnames[SMGOPTI_EXT])))
ok = ERROR;
break;
}
if (!save_options (optsw))
ok = ERROR;
break;
/* Direct options: Reset options to default */
case PT_res : if (!SetDefaultOptions ())
RETURN_ERR;
break;
/* Direct options: Help user */
case PT_hlp : SMHelpCmd (optsw);
break;
/* Ulovlig bryternavn, bare hvis bryternavn ikke er tomt: */
default : if (optname[0])
{
if (iEWarn)
DoWarning (_StrErrUnknownOption, fullopt);
else
RETERR (19, fullopt); /* Unknown option or switch! */
}
}
if (!ok) /* Sjekk om feil ved tolking av parameter */
RETERR (17, fullopt); /* Unknown or illegal argument of option! */
}
}
return (OK);
} /* interpret_parameters (); */