Skip to content

Commit 60049f3

Browse files
Modified the "select" command routine to get rid of the very hack
method of messing with the argument count when using qualifiers like "less" and "more". Now it keeps a separate count of the number of non-qualifier arguments.
1 parent 38d890c commit 60049f3

File tree

1 file changed

+42
-35
lines changed

1 file changed

+42
-35
lines changed

commands/CmdRS.c

+42-35
Original file line numberDiff line numberDiff line change
@@ -850,6 +850,8 @@ CmdSelect(w, cmd)
850850
ExtRectList *rlist;
851851
int option;
852852
int feedstyle;
853+
int isqual; // Command has a qualifier argument like "more", "less", etc.
854+
int primargs; // Number of arguments other than qualifiers
853855
bool layerspec;
854856
bool degenerate;
855857
bool doat = FALSE;
@@ -878,6 +880,7 @@ CmdSelect(w, cmd)
878880
* "less", "do", "no", "nocycle", "top", and "cell".
879881
*/
880882

883+
isqual = 0; // Track any qualifier argument
881884
if (cmd->tx_argc >= 2)
882885
{
883886
int arg1len = strlen(cmd->tx_argv[1]);
@@ -887,62 +890,64 @@ CmdSelect(w, cmd)
887890
{
888891
more = TRUE;
889892
less = FALSE;
893+
isqual = 1;
890894
optionArgs = &cmd->tx_argv[2];
891-
cmd->tx_argc--;
892895
}
893896
else if (!strncmp(cmd->tx_argv[1], "less", arg1len))
894897
{
895898
more = FALSE;
896899
less = TRUE;
900+
isqual = 1;
897901
optionArgs = &cmd->tx_argv[2];
898-
cmd->tx_argc--;
899902
}
900903
else if (!strncmp(cmd->tx_argv[1], "nocycle", arg1len))
901904
{
902905
samePlace = FALSE;
903906
labelpolicy = SEL_NO_LABELS;
904907
more = FALSE;
905908
less = FALSE;
909+
isqual = 1;
906910
type = TT_SELECTBASE - 1; /* avoid cycling between types */
907911
optionArgs = &cmd->tx_argv[2];
908-
cmd->tx_argc--;
909912
}
910913
else if (!strncmp(cmd->tx_argv[1], "same", arg1len))
911914
{
912915
/* Force this to be the same as the last selection command, */
913916
/* even if there were other commands in between. */
914917
lastCommand = TxCommandNumber - 1;
918+
isqual = 1;
915919
optionArgs = &cmd->tx_argv[2];
916-
cmd->tx_argc--;
917920
}
918921
else if (!strncmp(cmd->tx_argv[1], "do", arg1len))
919922
{
920923
labelpolicy = SEL_DO_LABELS;
924+
isqual = 1;
921925
optionArgs = &cmd->tx_argv[2];
922-
cmd->tx_argc--;
923926
}
924927
else if (!strncmp(cmd->tx_argv[1], "no", arg1len))
925928
{
926929
labelpolicy = SEL_NO_LABELS;
930+
isqual = 1;
927931
optionArgs = &cmd->tx_argv[2];
928-
cmd->tx_argc--;
929932
}
930933
else if (!strncmp(cmd->tx_argv[1], "simple", arg1len))
931934
{
932935
labelpolicy = SEL_SIMPLE_LABELS;
936+
isqual = 1;
933937
optionArgs = &cmd->tx_argv[2];
934-
cmd->tx_argc--;
935938
}
936-
937939
else if (!strncmp(cmd->tx_argv[1], "top", arg1len))
938940
{
939941
if ((cmd->tx_argc >= 3) && !strncmp(cmd->tx_argv[2],
940942
"cell", strlen(cmd->tx_argv[2])))
943+
{
944+
isqual = 1;
941945
optionArgs = &cmd->tx_argv[2];
946+
}
942947
}
943948

944949
doat = FALSE;
945-
if ((cmd->tx_argc > 3) && !strcmp(cmd->tx_argv[cmd->tx_argc - 3], "at"))
950+
if ((cmd->tx_argc - isqual > 3) && !strcmp(cmd->tx_argv[cmd->tx_argc - 3], "at"))
946951
{
947952
Point editPoint;
948953

@@ -952,29 +957,32 @@ CmdSelect(w, cmd)
952957
editPoint.p_y = cmdParseCoord(w, cmd->tx_argv[cmd->tx_argc - 1],
953958
FALSE, FALSE);
954959
GeoTransPoint(&EditToRootTransform, &editPoint, &atPoint);
960+
/* After registering "doat", ignore the arguments */
955961
cmd->tx_argc -= 3;
956962
}
957963
}
958964

959965
/* Check the option for validity. */
960966

961-
if (cmd->tx_argc == 1)
967+
primargs = cmd->tx_argc - isqual;
968+
if (primargs == 1)
962969
option = SEL_DEFAULT;
963970
else
964971
{
965972
char *fileName;
966973

967974
option = Lookup(optionArgs[0], cmdSelectOption);
968-
if (option < 0 && cmd->tx_argc != 2)
975+
if ((option < 0) && (primargs != 2))
969976
{
970977
TxError("\"%s\" isn't a valid select option.\n", cmd->tx_argv[1]);
971978
option = SEL_HELP;
972979
cmd->tx_argc = 2;
980+
primargs = 2;
973981
}
974982
else if (option < 0)
975983
{
976984
option = SEL_DEFAULT;
977-
if (more || less)
985+
if (more || less || (!samePlace))
978986
optionArgs = &cmd->tx_argv[1];
979987
else
980988
optionArgs = &cmd->tx_argv[0];
@@ -1002,17 +1010,17 @@ CmdSelect(w, cmd)
10021010
*/
10031011

10041012
case SEL_AREA:
1005-
if (cmd->tx_argc > 4)
1013+
if (primargs > 4)
10061014
{
10071015
usageError:
10081016
TxError("Bad arguments:\n select %s\n",
1009-
cmdSelectMsg[option+1]);
1017+
cmdSelectMsg[option + 1]);
10101018
return;
10111019
}
1012-
if (cmd->tx_argc == 4)
1020+
if (primargs == 4)
10131021
globmatch = optionArgs[2]; /* Label matching by glob */
10141022
if (!(more || less)) SelectClear();
1015-
if (cmd->tx_argc >= 3)
1023+
if (primargs >= 3)
10161024
cmdSelectArea(optionArgs[1], less, option, globmatch);
10171025
else cmdSelectArea("*,label,subcell", less, option, globmatch);
10181026
return;
@@ -1024,9 +1032,9 @@ CmdSelect(w, cmd)
10241032
*/
10251033

10261034
case SEL_VISIBLE:
1027-
if (cmd->tx_argc > 3) goto usageError;
1035+
if (primargs > 3) goto usageError;
10281036
if (!(more || less)) SelectClear();
1029-
if (cmd->tx_argc == 3)
1037+
if (primargs == 3)
10301038
cmdSelectArea(optionArgs[1], less, option, globmatch);
10311039
else cmdSelectArea("*,label,subcell", less, option, globmatch);
10321040
return;
@@ -1037,7 +1045,7 @@ CmdSelect(w, cmd)
10371045
*/
10381046

10391047
case SEL_INTERSECT:
1040-
if (cmd->tx_argc > 3) goto usageError;
1048+
if (primargs > 3) goto usageError;
10411049
cmdIntersectArea(optionArgs[1]);
10421050
return;
10431051

@@ -1047,7 +1055,7 @@ CmdSelect(w, cmd)
10471055
*/
10481056

10491057
case SEL_CLEAR:
1050-
if ((more) || (less) || (cmd->tx_argc > 2)) goto usageError;
1058+
if ((more) || (less) || (primargs > 2)) goto usageError;
10511059
SelectClear();
10521060
return;
10531061

@@ -1103,7 +1111,7 @@ CmdSelect(w, cmd)
11031111
*/
11041112

11051113
case SEL_KEEP:
1106-
if ((more) || (less) || (cmd->tx_argc > 2)) goto usageError;
1114+
if ((more) || (less) || (primargs > 2)) goto usageError;
11071115
SelectAndCopy1();
11081116
GeoTransRect(&SelectUse->cu_transform, &SelectDef->cd_bbox, &selarea);
11091117
DBWHLRedraw(SelectRootDef, &selarea, FALSE);
@@ -1115,7 +1123,7 @@ CmdSelect(w, cmd)
11151123
*/
11161124

11171125
case SEL_MOVE:
1118-
if ((more) || (less) || (cmd->tx_argc != 4)) goto usageError;
1126+
if ((more) || (less) || (primargs != 4)) goto usageError;
11191127

11201128
p.p_x = cmdParseCoord(w, cmd->tx_argv[2], FALSE, TRUE);
11211129
p.p_y = cmdParseCoord(w, cmd->tx_argv[3], FALSE, FALSE);
@@ -1139,7 +1147,7 @@ CmdSelect(w, cmd)
11391147
*/
11401148

11411149
case SEL_PICK:
1142-
if ((more) || (less) || (cmd->tx_argc > 2)) goto usageError;
1150+
if ((more) || (less) || (primargs > 2)) goto usageError;
11431151
SelectDelete("picked", FALSE);
11441152
DBWHLRedraw(SelectRootDef, &selarea, FALSE);
11451153
return;
@@ -1151,7 +1159,7 @@ CmdSelect(w, cmd)
11511159
*/
11521160

11531161
case SEL_FLAT:
1154-
if ((more) || (less) || (cmd->tx_argc > 2)) goto usageError;
1162+
if ((more) || (less) || (primargs > 2)) goto usageError;
11551163
SelectFlat();
11561164
return;
11571165

@@ -1161,7 +1169,7 @@ CmdSelect(w, cmd)
11611169
*/
11621170

11631171
case SEL_SAVE:
1164-
if (cmd->tx_argc != 3) goto usageError;
1172+
if (primargs != 3) goto usageError;
11651173

11661174
/* Be sure to paint DRC check information into the cell before
11671175
* saving it! Otherwise DRC problems may not be detected. Also
@@ -1185,7 +1193,7 @@ CmdSelect(w, cmd)
11851193
case SEL_FEEDBACK:
11861194
feedtext = NULL;
11871195
feedstyle = STYLE_ORANGE1;
1188-
if (cmd->tx_argc > 2)
1196+
if (primargs > 2)
11891197
{
11901198
/* Get style (To do) */
11911199
feedstyle = GrGetStyleFromName(cmd->tx_argv[2]);
@@ -1196,7 +1204,7 @@ CmdSelect(w, cmd)
11961204
" .dstyle file\n");
11971205
return;
11981206
}
1199-
if (cmd->tx_argc > 3)
1207+
if (primargs > 3)
12001208
feedtext = cmd->tx_argv[3];
12011209
}
12021210
SelCopyToFeedback(SelectRootDef, SelectUse, feedstyle,
@@ -1211,7 +1219,7 @@ CmdSelect(w, cmd)
12111219
*--------------------------------------------------------------------
12121220
*/
12131221
case SEL_SHORT:
1214-
if (cmd->tx_argc != 4) goto usageError;
1222+
if (primargs != 4) goto usageError;
12151223
rlist = SelectShort(cmd->tx_argv[2], cmd->tx_argv[3]);
12161224

12171225
if (rlist == NULL)
@@ -1245,8 +1253,8 @@ CmdSelect(w, cmd)
12451253
break;
12461254

12471255
case SEL_BOX: case SEL_CHUNK: case SEL_REGION: case SEL_NET:
1248-
if (cmd->tx_argc > 3) goto usageError;
1249-
if (cmd->tx_argc == 3)
1256+
if (primargs > 3) goto usageError;
1257+
if (primargs == 3)
12501258
layerspec = TRUE;
12511259
else
12521260
layerspec = FALSE;
@@ -1263,7 +1271,7 @@ CmdSelect(w, cmd)
12631271

12641272
case SEL_DEFAULT:
12651273

1266-
if (cmd->tx_argc == 2)
1274+
if (primargs == 2)
12671275
layerspec = TRUE;
12681276
else
12691277
layerspec = FALSE;
@@ -1325,7 +1333,6 @@ CmdSelect(w, cmd)
13251333
sprintf(aptr + 1, "at %di %di", scx.scx_area.r_xbot,
13261334
scx.scx_area.r_ybot);
13271335
TxRebuildCommand(cmd);
1328-
13291336
}
13301337
if (window == NULL) return;
13311338
scx.scx_use = (CellUse *) window->w_surfaceID;
@@ -1551,7 +1558,7 @@ CmdSelect(w, cmd)
15511558
return;
15521559
}
15531560

1554-
if (cmd->tx_argc > 3)
1561+
if (primargs > 3)
15551562
if (strcmp(cmd->tx_argv[cmd->tx_argc - 3], "at"))
15561563
goto usageError;
15571564

@@ -1560,7 +1567,7 @@ CmdSelect(w, cmd)
15601567
* click" code.
15611568
*/
15621569

1563-
if (((cmd->tx_argc == 3) || (cmd->tx_argc == 6)) &&
1570+
if (((primargs == 3) || (primargs == 6)) &&
15641571
(optionArgs == &cmd->tx_argv[2]) &&
15651572
(more == FALSE) && (less == FALSE))
15661573
{
@@ -1570,7 +1577,7 @@ CmdSelect(w, cmd)
15701577
trans = GeoIdentityTransform;
15711578
printPath = scx.scx_use->cu_id;
15721579
}
1573-
else if ((cmd->tx_argc == 3) || (cmd->tx_argc == 6))
1580+
else if ((primargs == 3) || (primargs == 6))
15741581
{
15751582
SearchContext scx2;
15761583

0 commit comments

Comments
 (0)