@@ -38,6 +38,7 @@ flag g_sourceHasBeenRead = 0; /* 1 if a source file has been read in */
38
38
vstring_def (g_rootDirectory ); /* Directory prefix to use for included files */
39
39
40
40
41
+ static flag getFullArg (long arg , const char * cmdList );
41
42
42
43
flag processCommandLine (void ) {
43
44
vstring_def (defaultArg );
@@ -1627,29 +1628,25 @@ flag processCommandLine(void) {
1627
1628
1628
1629
1629
1630
1630
- flag getFullArg (long arg , vstring cmdList1 ) {
1631
- /* This function converts the user's abbreviated keyword in
1632
- g_rawArgPntr[arg] to a full, upper-case keyword,
1633
- in g_fullArg[arg], matching
1634
- the available choices in cmdList. */
1635
- /* Special cases: cmdList = "# xxx <yyy>?" - get an integer */
1636
- /* cmdList = "* xxx <yyy>?" - get any string;
1637
- don't convert to upper case
1638
- cmdList = "& xxx <yyy>?" - same as * except
1639
- verify it is a file that exists */
1640
- /* "$" means a null argument is acceptable; put it in as
1641
- special character chr(3) so it can be recognized */
1642
-
1631
+ /* This function converts the user's abbreviated keyword in
1632
+ g_rawArgPntr[arg] to a full, upper-case keyword,
1633
+ in g_fullArg[arg], matching
1634
+ the available choices in cmdList. */
1635
+ /* Special cases: cmdList = "# xxx <yyy>?" - get an integer */
1636
+ /* cmdList = "* xxx <yyy>?" - get any string;
1637
+ don't convert to upper case
1638
+ cmdList = "& xxx <yyy>?" - same as * except
1639
+ verify it is a file that exists */
1640
+ /* "$" means a null argument is acceptable; put it in as
1641
+ special character chr(3) so it can be recognized */
1642
+ static flag getFullArg (long arg , const char * cmdList1 ) {
1643
1643
pntrString_def (possCmd );
1644
- long possCmds , i , j , k , m , p , q ;
1644
+ flag ret = 1 ;
1645
1645
vstring_def (defaultCmd );
1646
1646
vstring_def (infoStr );
1647
- vstring_def (tmpStr );
1648
- vstring_def (tmpArg );
1649
1647
vstring_def (errorLine );
1650
1648
vstring_def (keyword );
1651
1649
vstring_def (cmdList );
1652
- FILE * tmpFp ;
1653
1650
1654
1651
let (& cmdList ,cmdList1 ); /* In case cmdList1 gets deallocated when it comes
1655
1652
directly from a vstring function such as cat() */
@@ -1669,32 +1666,38 @@ flag getFullArg(long arg, vstring cmdList1) {
1669
1666
if (g_rawArgs <= arg ) bug (1103 );
1670
1667
1671
1668
g_queryMode = 1 ;
1672
- tmpArg = cmdInput1 (right (cmdList ,3 ));
1669
+ vstring argLine = cmdInput1 (right (cmdList ,3 ));
1673
1670
let (& errorLine ,right (cmdList ,3 ));
1674
- if (tmpArg [0 ] == 0 ) { /* Use default argument */
1675
- let (& tmpArg , seg (defaultCmd ,2 ,len (defaultCmd ) - 1 ));
1671
+ if (argLine [0 ] == 0 ) { /* Use default argument */
1672
+ let (& argLine , seg (defaultCmd ,2 ,len (defaultCmd ) - 1 ));
1676
1673
}
1677
- let ((vstring * )(& g_rawArgPntr [arg ]), tmpArg );
1674
+ let ((vstring * )(& g_rawArgPntr [arg ]), argLine );
1675
+ free_vstring (argLine );
1678
1676
g_rawArgNmbr [arg ] = len (cmdList ) - 1 ;/* Line position for error msgs */
1679
1677
1680
1678
} /* End of asking user for additional argument */
1681
1679
1682
1680
/* Make sure that the argument is a non-negative integer */
1681
+ vstring_def (tmpArg );
1683
1682
let (& tmpArg ,g_rawArgPntr [arg ]);
1684
1683
if (tmpArg [0 ] == 0 ) { /* Use default argument */
1685
1684
/* (This code is needed in case of null string passed directly) */
1686
1685
let (& tmpArg , seg (defaultCmd ,2 ,len (defaultCmd ) - 1 ));
1687
1686
}
1687
+ vstring_def (tmpStr );
1688
1688
let (& tmpStr , str (val (tmpArg )));
1689
1689
let (& tmpStr , cat (string (len (tmpArg )- len (tmpStr ),'0' ), tmpStr , NULL ));
1690
1690
if (strcmp (tmpStr , tmpArg )) {
1691
1691
printCommandError (errorLine , arg ,
1692
1692
"?A number was expected here." );
1693
- goto return0 ;
1693
+ ret = 0 ;
1694
+ } else {
1695
+ let (& keyword , str (val (tmpArg )));
1694
1696
}
1695
1697
1696
- let (& keyword , str (val (tmpArg )));
1697
- goto return1 ;
1698
+ free_vstring (tmpArg );
1699
+ free_vstring (tmpStr );
1700
+ goto getFullArg_ret ;
1698
1701
}
1699
1702
1700
1703
@@ -1711,14 +1714,14 @@ flag getFullArg(long arg, vstring cmdList1) {
1711
1714
if (!strcmp (defaultCmd , "<$>" )) { /* End of command acceptable */
1712
1715
/* Note: in this case, user will never be prompted for anything. */
1713
1716
let (& keyword ,chr (3 ));
1714
- goto return1 ;
1717
+ goto getFullArg_ret ;
1715
1718
}
1716
1719
g_rawArgs ++ ;
1717
1720
pntrLet (& g_rawArgPntr , pntrAddElement (g_rawArgPntr ));
1718
1721
nmbrLet (& g_rawArgNmbr , nmbrAddElement (g_rawArgNmbr , 0 ));
1719
1722
if (g_rawArgs <= arg ) bug (1104 );
1720
1723
g_queryMode = 1 ;
1721
- tmpArg = cmdInput1 (right (cmdList ,3 ));
1724
+ vstring tmpArg = cmdInput1 (right (cmdList ,3 ));
1722
1725
1723
1726
/* Strip off any quotes around it
1724
1727
and tolerate lack of trailing quote */
@@ -1738,7 +1741,7 @@ flag getFullArg(long arg, vstring cmdList1) {
1738
1741
}
1739
1742
let ((vstring * )(& g_rawArgPntr [arg ]), tmpArg );
1740
1743
g_rawArgNmbr [arg ] = len (cmdList ) - 1 ; /* Line position for error msgs */
1741
-
1744
+ free_vstring ( tmpArg );
1742
1745
} /* End of asking user for additional argument */
1743
1746
1744
1747
let (& keyword ,g_rawArgPntr [arg ]);
@@ -1765,32 +1768,37 @@ flag getFullArg(long arg, vstring cmdList1) {
1765
1768
}
1766
1769
if (cmdList [0 ] == '&' ) {
1767
1770
/* See if file exists */
1771
+ vstring_def (tmpStr );
1768
1772
let (& tmpStr , cat (g_rootDirectory , keyword , NULL ));
1769
- tmpFp = fopen (tmpStr , "r" );
1773
+ FILE * tmpFp = fopen (tmpStr , "r" );
1770
1774
if (!tmpFp ) {
1771
1775
let (& tmpStr , cat ("?Sorry, couldn't open the file \"" , tmpStr , "\"." , NULL ));
1772
1776
printCommandError (errorLine , arg , tmpStr );
1773
- goto return0 ;
1777
+ free_vstring (tmpStr );
1778
+ ret = 0 ;
1779
+ } else {
1780
+ fclose (tmpFp );
1774
1781
}
1775
- fclose (tmpFp );
1776
1782
}
1777
- goto return1 ;
1783
+ goto getFullArg_ret ;
1778
1784
}
1779
1785
1780
1786
1781
1787
1782
1788
/* Parse the choices available */
1783
- possCmds = 0 ;
1784
- p = 0 ;
1789
+ long possCmds = 0 ;
1790
+ long p = 0 ;
1791
+ long q = 0 ;
1785
1792
while (1 ) {
1786
- q = p ;
1787
1793
p = instr (p + 1 , cat (cmdList , "|" , NULL ), "|" );
1788
1794
if (!p ) break ;
1789
1795
pntrLet (& possCmd ,pntrAddElement (possCmd ));
1790
1796
let ((vstring * )(& possCmd [possCmds ]),seg (cmdList ,q + 1 ,p - 1 ));
1791
1797
possCmds ++ ;
1798
+ q = p ;
1792
1799
}
1793
1800
if (!strcmp (left (possCmd [possCmds - 1 ],1 ), "<" )) {
1801
+ // free_vstring(defaultCmd); // Not needed because defaultCmd is already empty
1794
1802
/* Get default argument, if any */
1795
1803
defaultCmd = possCmd [possCmds - 1 ]; /* re-use old allocation */
1796
1804
if (!strcmp (defaultCmd , "<$>" )) {
@@ -1805,17 +1813,19 @@ flag getFullArg(long arg, vstring cmdList1) {
1805
1813
}
1806
1814
1807
1815
/* Create a string used for queries and error messages */
1808
- if (possCmds < 1 ) bug (1105 );
1816
+ if (possCmds < 1 ) {
1817
+ bug (1105 );
1818
+ ret = 0 ;
1819
+ goto getFullArg_ret ;
1820
+ }
1809
1821
if (possCmds == 1 ) {
1810
1822
let (& infoStr ,possCmd [0 ]);
1811
- }
1812
- if (possCmds == 2 ) {
1823
+ } else if (possCmds == 2 ) {
1813
1824
let (& infoStr , cat (possCmd [0 ], " or " ,
1814
1825
possCmd [1 ], NULL ));
1815
- }
1816
- if (possCmds > 2 ) {
1826
+ } else /* possCmds > 2 */ {
1817
1827
let (& infoStr , "" );
1818
- for (i = 0 ; i < possCmds - 1 ; i ++ ) {
1828
+ for (long i = 0 ; i < possCmds - 1 ; i ++ ) {
1819
1829
let (& infoStr , cat (infoStr , possCmd [i ], ", " , NULL ));
1820
1830
}
1821
1831
let (& infoStr , cat (infoStr , "or " , possCmd [possCmds - 1 ], NULL ));
@@ -1825,12 +1835,14 @@ flag getFullArg(long arg, vstring cmdList1) {
1825
1835
if (g_rawArgs <= arg && (strcmp (possCmd [possCmds - 1 ], "nothing" )
1826
1836
|| g_queryMode == 1 )) {
1827
1837
1838
+ vstring_def (tmpStr );
1828
1839
let (& tmpStr , infoStr );
1829
1840
if (defaultCmd [0 ] != 0 ) {
1830
1841
let (& tmpStr , cat (tmpStr , " " ,defaultCmd , NULL ));
1831
1842
}
1832
1843
let (& tmpStr , cat (tmpStr , "? " , NULL ));
1833
1844
g_queryMode = 1 ;
1845
+ vstring_def (tmpArg );
1834
1846
if (possCmds != 1 ) {
1835
1847
tmpArg = cmdInput1 (tmpStr );
1836
1848
} else {
@@ -1839,7 +1851,7 @@ flag getFullArg(long arg, vstring cmdList1) {
1839
1851
if (!strcmp (cmdList , "$|<$>" )) {
1840
1852
let (& tmpArg , possCmd [0 ]);
1841
1853
print2 ("The command so far is: " );
1842
- for (i = 0 ; i < arg ; i ++ ) {
1854
+ for (long i = 0 ; i < arg ; i ++ ) {
1843
1855
print2 ("%s " , g_fullArg [i ]);
1844
1856
}
1845
1857
print2 ("%s\n" , tmpArg );
@@ -1859,22 +1871,25 @@ flag getFullArg(long arg, vstring cmdList1) {
1859
1871
g_rawArgNmbr [arg ] = len (tmpStr ) + 1 ; /* Line position for error msgs */
1860
1872
}
1861
1873
1874
+ free_vstring (tmpStr );
1875
+ free_vstring (tmpArg );
1862
1876
} /* End of asking user for additional argument */
1863
1877
1864
1878
if (g_rawArgs <= arg ) {
1865
1879
/* No argument was specified, and "nothing" is a valid argument */
1866
1880
let (& keyword ,chr (3 ));
1867
- goto return1 ;
1881
+ goto getFullArg_ret ;
1868
1882
}
1869
1883
1870
1884
1885
+ vstring_def (tmpArg );
1871
1886
let (& tmpArg ,edit (g_rawArgPntr [arg ], 32 )); /* Convert to upper case */
1872
- j = 0 ;
1873
- k = 0 ;
1874
- m = len (tmpArg );
1875
- let ( & tmpStr , "" );
1887
+ long j = 0 ;
1888
+ long k = 0 ;
1889
+ long m = len (tmpArg );
1890
+ vstring_def ( tmpStr );
1876
1891
/* Scan the possible arguments for a match */
1877
- for (i = 0 ; i < possCmds ; i ++ ) {
1892
+ for (long i = 0 ; i < possCmds ; i ++ ) {
1878
1893
if (!strcmp (possCmd [i ], tmpArg )) {
1879
1894
/* An exact match was found, so ignore any other matches
1880
1895
and use this one */
@@ -1892,6 +1907,7 @@ flag getFullArg(long arg, vstring cmdList1) {
1892
1907
k ++ ; /* Number of matches */
1893
1908
}
1894
1909
}
1910
+ free_vstring (tmpArg );
1895
1911
if (k < 1 || k > 1 ) {
1896
1912
if (k < 1 ) {
1897
1913
let (& tmpStr , cat ("?Expected " , infoStr , "." , NULL ));
@@ -1907,53 +1923,41 @@ flag getFullArg(long arg, vstring cmdList1) {
1907
1923
let (& tmpStr , cat ("?Ambiguous keyword - please specify " ,tmpStr , "." , NULL ));
1908
1924
}
1909
1925
printCommandError (errorLine , arg , tmpStr );
1910
- goto return0 ;
1926
+ free_vstring (tmpStr );
1927
+ ret = 0 ;
1928
+ goto getFullArg_ret ;
1911
1929
}
1930
+ free_vstring (tmpStr );
1912
1931
1913
1932
let (& keyword ,possCmd [j ]);
1914
- goto return1 ;
1915
1933
1916
- return1 :
1917
- if (keyword [0 ] == 0 ) {
1918
- if (g_rawArgs > arg && strcmp (defaultCmd , "<>" )) {
1919
- /* otherwise, "nothing" was specified */
1920
- printCommandError ("" , arg ,
1921
- "?No default answer is available - please be explicit." );
1922
- goto return0 ;
1923
- }
1934
+ getFullArg_ret :
1935
+ if (ret ) {
1936
+ if (keyword [0 ] == 0 ) {
1937
+ if (g_rawArgs > arg && strcmp (defaultCmd , "<>" )) {
1938
+ /* otherwise, "nothing" was specified */
1939
+ printCommandError ("" , arg ,
1940
+ "?No default answer is available - please be explicit." );
1941
+ ret = 0 ;
1942
+ goto getFullArg_ret ;
1943
+ }
1944
+ }
1945
+ /* Add new field to g_fullArg */
1946
+ pntrLet (& g_fullArg ,pntrAddElement (g_fullArg ));
1947
+ if (pntrLen (g_fullArg ) != arg + 1 ) bug (1107 );
1948
+ else let ((vstring * )(& g_fullArg [arg ]),keyword );
1924
1949
}
1925
- /* Add new field to g_fullArg */
1926
- pntrLet (& g_fullArg ,pntrAddElement (g_fullArg ));
1927
- if (pntrLen (g_fullArg ) != arg + 1 ) bug (1107 );
1928
- let ((vstring * )(& g_fullArg [arg ]),keyword );
1929
-
1930
- /* Deallocate memory */
1931
- j = pntrLen (possCmd );
1932
- for (i = 0 ; i < j ; i ++ ) free_vstring (* (vstring * )(& possCmd [i ]));
1933
- free_pntrString (possCmd );
1934
- free_vstring (defaultCmd );
1935
- free_vstring (infoStr );
1936
- free_vstring (tmpStr );
1937
- free_vstring (tmpArg );
1938
- free_vstring (errorLine );
1939
- free_vstring (keyword );
1940
- free_vstring (cmdList );
1941
- return (1 );
1942
1950
1943
- return0 :
1944
1951
/* Deallocate memory */
1945
- j = pntrLen (possCmd );
1946
- for (i = 0 ; i < j ; i ++ ) free_vstring (* (vstring * )(& possCmd [i ]));
1952
+ long len = pntrLen (possCmd );
1953
+ for (long i = 0 ; i < len ; i ++ ) free_vstring (* (vstring * )(& possCmd [i ]));
1947
1954
free_pntrString (possCmd );
1948
1955
free_vstring (defaultCmd );
1949
1956
free_vstring (infoStr );
1950
- free_vstring (tmpStr );
1951
- free_vstring (tmpArg );
1952
1957
free_vstring (errorLine );
1953
1958
free_vstring (keyword );
1954
1959
free_vstring (cmdList );
1955
- return (0 );
1956
-
1960
+ return ret ;
1957
1961
} /* getFullArg */
1958
1962
1959
1963
0 commit comments