@@ -850,6 +850,8 @@ CmdSelect(w, cmd)
850
850
ExtRectList * rlist ;
851
851
int option ;
852
852
int feedstyle ;
853
+ int isqual ; // Command has a qualifier argument like "more", "less", etc.
854
+ int primargs ; // Number of arguments other than qualifiers
853
855
bool layerspec ;
854
856
bool degenerate ;
855
857
bool doat = FALSE;
@@ -878,6 +880,7 @@ CmdSelect(w, cmd)
878
880
* "less", "do", "no", "nocycle", "top", and "cell".
879
881
*/
880
882
883
+ isqual = 0 ; // Track any qualifier argument
881
884
if (cmd -> tx_argc >= 2 )
882
885
{
883
886
int arg1len = strlen (cmd -> tx_argv [1 ]);
@@ -887,62 +890,64 @@ CmdSelect(w, cmd)
887
890
{
888
891
more = TRUE;
889
892
less = FALSE;
893
+ isqual = 1 ;
890
894
optionArgs = & cmd -> tx_argv [2 ];
891
- cmd -> tx_argc -- ;
892
895
}
893
896
else if (!strncmp (cmd -> tx_argv [1 ], "less" , arg1len ))
894
897
{
895
898
more = FALSE;
896
899
less = TRUE;
900
+ isqual = 1 ;
897
901
optionArgs = & cmd -> tx_argv [2 ];
898
- cmd -> tx_argc -- ;
899
902
}
900
903
else if (!strncmp (cmd -> tx_argv [1 ], "nocycle" , arg1len ))
901
904
{
902
905
samePlace = FALSE;
903
906
labelpolicy = SEL_NO_LABELS ;
904
907
more = FALSE;
905
908
less = FALSE;
909
+ isqual = 1 ;
906
910
type = TT_SELECTBASE - 1 ; /* avoid cycling between types */
907
911
optionArgs = & cmd -> tx_argv [2 ];
908
- cmd -> tx_argc -- ;
909
912
}
910
913
else if (!strncmp (cmd -> tx_argv [1 ], "same" , arg1len ))
911
914
{
912
915
/* Force this to be the same as the last selection command, */
913
916
/* even if there were other commands in between. */
914
917
lastCommand = TxCommandNumber - 1 ;
918
+ isqual = 1 ;
915
919
optionArgs = & cmd -> tx_argv [2 ];
916
- cmd -> tx_argc -- ;
917
920
}
918
921
else if (!strncmp (cmd -> tx_argv [1 ], "do" , arg1len ))
919
922
{
920
923
labelpolicy = SEL_DO_LABELS ;
924
+ isqual = 1 ;
921
925
optionArgs = & cmd -> tx_argv [2 ];
922
- cmd -> tx_argc -- ;
923
926
}
924
927
else if (!strncmp (cmd -> tx_argv [1 ], "no" , arg1len ))
925
928
{
926
929
labelpolicy = SEL_NO_LABELS ;
930
+ isqual = 1 ;
927
931
optionArgs = & cmd -> tx_argv [2 ];
928
- cmd -> tx_argc -- ;
929
932
}
930
933
else if (!strncmp (cmd -> tx_argv [1 ], "simple" , arg1len ))
931
934
{
932
935
labelpolicy = SEL_SIMPLE_LABELS ;
936
+ isqual = 1 ;
933
937
optionArgs = & cmd -> tx_argv [2 ];
934
- cmd -> tx_argc -- ;
935
938
}
936
-
937
939
else if (!strncmp (cmd -> tx_argv [1 ], "top" , arg1len ))
938
940
{
939
941
if ((cmd -> tx_argc >= 3 ) && !strncmp (cmd -> tx_argv [2 ],
940
942
"cell" , strlen (cmd -> tx_argv [2 ])))
943
+ {
944
+ isqual = 1 ;
941
945
optionArgs = & cmd -> tx_argv [2 ];
946
+ }
942
947
}
943
948
944
949
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" ))
946
951
{
947
952
Point editPoint ;
948
953
@@ -952,29 +957,32 @@ CmdSelect(w, cmd)
952
957
editPoint .p_y = cmdParseCoord (w , cmd -> tx_argv [cmd -> tx_argc - 1 ],
953
958
FALSE, FALSE);
954
959
GeoTransPoint (& EditToRootTransform , & editPoint , & atPoint );
960
+ /* After registering "doat", ignore the arguments */
955
961
cmd -> tx_argc -= 3 ;
956
962
}
957
963
}
958
964
959
965
/* Check the option for validity. */
960
966
961
- if (cmd -> tx_argc == 1 )
967
+ primargs = cmd -> tx_argc - isqual ;
968
+ if (primargs == 1 )
962
969
option = SEL_DEFAULT ;
963
970
else
964
971
{
965
972
char * fileName ;
966
973
967
974
option = Lookup (optionArgs [0 ], cmdSelectOption );
968
- if (option < 0 && cmd -> tx_argc != 2 )
975
+ if (( option < 0 ) && ( primargs != 2 ) )
969
976
{
970
977
TxError ("\"%s\" isn't a valid select option.\n" , cmd -> tx_argv [1 ]);
971
978
option = SEL_HELP ;
972
979
cmd -> tx_argc = 2 ;
980
+ primargs = 2 ;
973
981
}
974
982
else if (option < 0 )
975
983
{
976
984
option = SEL_DEFAULT ;
977
- if (more || less )
985
+ if (more || less || (! samePlace ) )
978
986
optionArgs = & cmd -> tx_argv [1 ];
979
987
else
980
988
optionArgs = & cmd -> tx_argv [0 ];
@@ -1002,17 +1010,17 @@ CmdSelect(w, cmd)
1002
1010
*/
1003
1011
1004
1012
case SEL_AREA :
1005
- if (cmd -> tx_argc > 4 )
1013
+ if (primargs > 4 )
1006
1014
{
1007
1015
usageError :
1008
1016
TxError ("Bad arguments:\n select %s\n" ,
1009
- cmdSelectMsg [option + 1 ]);
1017
+ cmdSelectMsg [option + 1 ]);
1010
1018
return ;
1011
1019
}
1012
- if (cmd -> tx_argc == 4 )
1020
+ if (primargs == 4 )
1013
1021
globmatch = optionArgs [2 ]; /* Label matching by glob */
1014
1022
if (!(more || less )) SelectClear ();
1015
- if (cmd -> tx_argc >= 3 )
1023
+ if (primargs >= 3 )
1016
1024
cmdSelectArea (optionArgs [1 ], less , option , globmatch );
1017
1025
else cmdSelectArea ("*,label,subcell" , less , option , globmatch );
1018
1026
return ;
@@ -1024,9 +1032,9 @@ CmdSelect(w, cmd)
1024
1032
*/
1025
1033
1026
1034
case SEL_VISIBLE :
1027
- if (cmd -> tx_argc > 3 ) goto usageError ;
1035
+ if (primargs > 3 ) goto usageError ;
1028
1036
if (!(more || less )) SelectClear ();
1029
- if (cmd -> tx_argc == 3 )
1037
+ if (primargs == 3 )
1030
1038
cmdSelectArea (optionArgs [1 ], less , option , globmatch );
1031
1039
else cmdSelectArea ("*,label,subcell" , less , option , globmatch );
1032
1040
return ;
@@ -1037,7 +1045,7 @@ CmdSelect(w, cmd)
1037
1045
*/
1038
1046
1039
1047
case SEL_INTERSECT :
1040
- if (cmd -> tx_argc > 3 ) goto usageError ;
1048
+ if (primargs > 3 ) goto usageError ;
1041
1049
cmdIntersectArea (optionArgs [1 ]);
1042
1050
return ;
1043
1051
@@ -1047,7 +1055,7 @@ CmdSelect(w, cmd)
1047
1055
*/
1048
1056
1049
1057
case SEL_CLEAR :
1050
- if ((more ) || (less ) || (cmd -> tx_argc > 2 )) goto usageError ;
1058
+ if ((more ) || (less ) || (primargs > 2 )) goto usageError ;
1051
1059
SelectClear ();
1052
1060
return ;
1053
1061
@@ -1103,7 +1111,7 @@ CmdSelect(w, cmd)
1103
1111
*/
1104
1112
1105
1113
case SEL_KEEP :
1106
- if ((more ) || (less ) || (cmd -> tx_argc > 2 )) goto usageError ;
1114
+ if ((more ) || (less ) || (primargs > 2 )) goto usageError ;
1107
1115
SelectAndCopy1 ();
1108
1116
GeoTransRect (& SelectUse -> cu_transform , & SelectDef -> cd_bbox , & selarea );
1109
1117
DBWHLRedraw (SelectRootDef , & selarea , FALSE);
@@ -1115,7 +1123,7 @@ CmdSelect(w, cmd)
1115
1123
*/
1116
1124
1117
1125
case SEL_MOVE :
1118
- if ((more ) || (less ) || (cmd -> tx_argc != 4 )) goto usageError ;
1126
+ if ((more ) || (less ) || (primargs != 4 )) goto usageError ;
1119
1127
1120
1128
p .p_x = cmdParseCoord (w , cmd -> tx_argv [2 ], FALSE, TRUE);
1121
1129
p .p_y = cmdParseCoord (w , cmd -> tx_argv [3 ], FALSE, FALSE);
@@ -1139,7 +1147,7 @@ CmdSelect(w, cmd)
1139
1147
*/
1140
1148
1141
1149
case SEL_PICK :
1142
- if ((more ) || (less ) || (cmd -> tx_argc > 2 )) goto usageError ;
1150
+ if ((more ) || (less ) || (primargs > 2 )) goto usageError ;
1143
1151
SelectDelete ("picked" , FALSE);
1144
1152
DBWHLRedraw (SelectRootDef , & selarea , FALSE);
1145
1153
return ;
@@ -1151,7 +1159,7 @@ CmdSelect(w, cmd)
1151
1159
*/
1152
1160
1153
1161
case SEL_FLAT :
1154
- if ((more ) || (less ) || (cmd -> tx_argc > 2 )) goto usageError ;
1162
+ if ((more ) || (less ) || (primargs > 2 )) goto usageError ;
1155
1163
SelectFlat ();
1156
1164
return ;
1157
1165
@@ -1161,7 +1169,7 @@ CmdSelect(w, cmd)
1161
1169
*/
1162
1170
1163
1171
case SEL_SAVE :
1164
- if (cmd -> tx_argc != 3 ) goto usageError ;
1172
+ if (primargs != 3 ) goto usageError ;
1165
1173
1166
1174
/* Be sure to paint DRC check information into the cell before
1167
1175
* saving it! Otherwise DRC problems may not be detected. Also
@@ -1185,7 +1193,7 @@ CmdSelect(w, cmd)
1185
1193
case SEL_FEEDBACK :
1186
1194
feedtext = NULL ;
1187
1195
feedstyle = STYLE_ORANGE1 ;
1188
- if (cmd -> tx_argc > 2 )
1196
+ if (primargs > 2 )
1189
1197
{
1190
1198
/* Get style (To do) */
1191
1199
feedstyle = GrGetStyleFromName (cmd -> tx_argv [2 ]);
@@ -1196,7 +1204,7 @@ CmdSelect(w, cmd)
1196
1204
" .dstyle file\n" );
1197
1205
return ;
1198
1206
}
1199
- if (cmd -> tx_argc > 3 )
1207
+ if (primargs > 3 )
1200
1208
feedtext = cmd -> tx_argv [3 ];
1201
1209
}
1202
1210
SelCopyToFeedback (SelectRootDef , SelectUse , feedstyle ,
@@ -1211,7 +1219,7 @@ CmdSelect(w, cmd)
1211
1219
*--------------------------------------------------------------------
1212
1220
*/
1213
1221
case SEL_SHORT :
1214
- if (cmd -> tx_argc != 4 ) goto usageError ;
1222
+ if (primargs != 4 ) goto usageError ;
1215
1223
rlist = SelectShort (cmd -> tx_argv [2 ], cmd -> tx_argv [3 ]);
1216
1224
1217
1225
if (rlist == NULL )
@@ -1245,8 +1253,8 @@ CmdSelect(w, cmd)
1245
1253
break ;
1246
1254
1247
1255
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 )
1250
1258
layerspec = TRUE;
1251
1259
else
1252
1260
layerspec = FALSE;
@@ -1263,7 +1271,7 @@ CmdSelect(w, cmd)
1263
1271
1264
1272
case SEL_DEFAULT :
1265
1273
1266
- if (cmd -> tx_argc == 2 )
1274
+ if (primargs == 2 )
1267
1275
layerspec = TRUE;
1268
1276
else
1269
1277
layerspec = FALSE;
@@ -1325,7 +1333,6 @@ CmdSelect(w, cmd)
1325
1333
sprintf (aptr + 1 , "at %di %di" , scx .scx_area .r_xbot ,
1326
1334
scx .scx_area .r_ybot );
1327
1335
TxRebuildCommand (cmd );
1328
-
1329
1336
}
1330
1337
if (window == NULL ) return ;
1331
1338
scx .scx_use = (CellUse * ) window -> w_surfaceID ;
@@ -1551,7 +1558,7 @@ CmdSelect(w, cmd)
1551
1558
return ;
1552
1559
}
1553
1560
1554
- if (cmd -> tx_argc > 3 )
1561
+ if (primargs > 3 )
1555
1562
if (strcmp (cmd -> tx_argv [cmd -> tx_argc - 3 ], "at" ))
1556
1563
goto usageError ;
1557
1564
@@ -1560,7 +1567,7 @@ CmdSelect(w, cmd)
1560
1567
* click" code.
1561
1568
*/
1562
1569
1563
- if (((cmd -> tx_argc == 3 ) || (cmd -> tx_argc == 6 )) &&
1570
+ if (((primargs == 3 ) || (primargs == 6 )) &&
1564
1571
(optionArgs == & cmd -> tx_argv [2 ]) &&
1565
1572
(more == FALSE) && (less == FALSE))
1566
1573
{
@@ -1570,7 +1577,7 @@ CmdSelect(w, cmd)
1570
1577
trans = GeoIdentityTransform ;
1571
1578
printPath = scx .scx_use -> cu_id ;
1572
1579
}
1573
- else if ((cmd -> tx_argc == 3 ) || (cmd -> tx_argc == 6 ))
1580
+ else if ((primargs == 3 ) || (primargs == 6 ))
1574
1581
{
1575
1582
SearchContext scx2 ;
1576
1583
0 commit comments