fork of PCE focusing on macplus, supporting DaynaPort SCSI network emulation
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

psi: Support inverting the current selection

This patch adds the option -x to invert the current selection.
Individual parts of the selection can be inverted by prefixing
them with a - sign.

Hampa Hug a3b876d6 49715b60

+69 -44
+60 -38
src/utils/psi/main.c
··· 48 48 unsigned par_filler = 0xf6; 49 49 unsigned long par_cnt; 50 50 51 - int par_cyl_all = 1; 51 + char par_invert = 0; 52 + 53 + char par_cyl_all = 1; 54 + char par_cyl_inv = 0; 52 55 unsigned par_cyl[2]; 53 56 54 - int par_trk_all = 1; 57 + char par_trk_all = 1; 58 + char par_trk_inv = 0; 55 59 unsigned par_trk[2]; 56 60 57 - int par_sct_all = 1; 61 + char par_sct_all = 1; 62 + char par_sct_inv = 0; 58 63 unsigned par_sct[2]; 59 64 60 - int par_rsc_all = 1; 65 + char par_rsc_all = 1; 66 + char par_rsc_inv = 0; 61 67 unsigned par_rsc[2]; 62 68 63 - int par_alt_all = 1; 69 + char par_alt_all = 1; 70 + char par_alt_inv = 0; 64 71 unsigned par_alt[2]; 65 72 66 73 ··· 95 102 { 'S', 1, "real-sectors", "s", "Select real sectors [all]" }, 96 103 { 'v', 0, "verbose", NULL, "Verbose operation [no]" }, 97 104 { 'V', 0, "version", NULL, "Print version information" }, 105 + { 'x', 0, "invert", NULL, "Invert the selection [no]" }, 98 106 { -1, 0, NULL, NULL, NULL } 99 107 }; 100 108 ··· 162 170 163 171 164 172 static 165 - int psi_parse_range (const char *str, unsigned *v1, unsigned *v2, int *all) 173 + int psi_parse_range (const char *str, unsigned *v1, unsigned *v2, char *all, char *inv) 166 174 { 167 175 *v1 = 0; 168 176 *v2 = 0; 169 177 *all = 0; 178 + *inv = 0; 179 + 180 + if (*str == '-') { 181 + *inv = 1; 182 + str += 1; 183 + } 170 184 171 185 if (strcmp (str, "all") == 0) { 172 186 *all = 1; ··· 230 244 } 231 245 232 246 static 247 + int psi_sel_compare (unsigned v, unsigned v1, unsigned v2, char all, char inv) 248 + { 249 + int r; 250 + 251 + r = (all || ((v >= v1) && (v <= v2))); 252 + 253 + if (inv) { 254 + r = !r; 255 + } 256 + 257 + return (r); 258 + } 259 + 260 + static 233 261 int psi_sel_match_track (unsigned c, unsigned h) 234 262 { 235 - if (par_cyl_all == 0) { 236 - if ((c < par_cyl[0]) || (c > par_cyl[1])) { 237 - return (0); 238 - } 263 + if (psi_sel_compare (c, par_cyl[0], par_cyl[1], par_cyl_all, par_cyl_inv) == 0) { 264 + return (par_invert); 239 265 } 240 266 241 - if (par_trk_all == 0) { 242 - if ((h < par_trk[0]) || (h > par_trk[1])) { 243 - return (0); 244 - } 267 + if (psi_sel_compare (h, par_trk[0], par_trk[1], par_trk_all, par_trk_inv) == 0) { 268 + return (par_invert); 245 269 } 246 270 247 - return (1); 271 + return (!par_invert); 248 272 } 249 273 250 274 int psi_sel_match (unsigned c, unsigned h, unsigned s, unsigned r, unsigned a) 251 275 { 252 - if (psi_sel_match_track (c, h) == 0) { 253 - return (0); 276 + if (psi_sel_match_track (c, h) == par_invert) { 277 + return (par_invert); 254 278 } 255 279 256 - if (par_sct_all == 0) { 257 - if ((s < par_sct[0]) || (s > par_sct[1])) { 258 - return (0); 259 - } 280 + if (psi_sel_compare (s, par_sct[0], par_sct[1], par_sct_all, par_sct_inv) == 0) { 281 + return (par_invert); 260 282 } 261 283 262 - if (par_rsc_all == 0) { 263 - if ((r < par_rsc[0]) || (r > par_rsc[1])) { 264 - return (0); 265 - } 284 + if (psi_sel_compare (r, par_rsc[0], par_rsc[1], par_rsc_all, par_rsc_inv) == 0) { 285 + return (par_invert); 266 286 } 267 287 268 - if (par_alt_all == 0) { 269 - if ((a < par_alt[0]) || (a > par_alt[1])) { 270 - return (0); 271 - } 288 + if (psi_sel_compare (a, par_alt[0], par_alt[1], par_alt_all, par_alt_inv) == 0) { 289 + return (par_invert); 272 290 } 273 291 274 - return (1); 292 + return (!par_invert); 275 293 } 276 294 277 295 int psi_for_all_sectors (psi_img_t *img, psi_sct_cb fct, void *opaque) ··· 557 575 return (0); 558 576 559 577 case 'a': 560 - if (psi_parse_range (optarg[0], &par_alt[0], &par_alt[1], &par_alt_all)) { 578 + if (psi_parse_range (optarg[0], &par_alt[0], &par_alt[1], &par_alt_all, &par_alt_inv)) { 561 579 return (1); 562 580 } 563 581 break; 564 582 565 583 case 'c': 566 - if (psi_parse_range (optarg[0], &par_cyl[0], &par_cyl[1], &par_cyl_all)) { 584 + if (psi_parse_range (optarg[0], &par_cyl[0], &par_cyl[1], &par_cyl_all, &par_cyl_inv)) { 567 585 return (1); 568 586 } 569 587 break; ··· 590 608 break; 591 609 592 610 case 'h': 593 - if (psi_parse_range (optarg[0], &par_trk[0], &par_trk[1], &par_trk_all)) { 611 + if (psi_parse_range (optarg[0], &par_trk[0], &par_trk[1], &par_trk_all, &par_trk_inv)) { 594 612 return (1); 595 613 } 596 614 break; ··· 687 705 break; 688 706 689 707 case 'r': 690 - if (psi_parse_range (optarg[0], &par_cyl[0], &par_cyl[1], &par_cyl_all)) { 708 + if (psi_parse_range (optarg[0], &par_cyl[0], &par_cyl[1], &par_cyl_all, &par_cyl_inv)) { 691 709 return (1); 692 710 } 693 711 694 - if (psi_parse_range (optarg[1], &par_trk[0], &par_trk[1], &par_trk_all)) { 712 + if (psi_parse_range (optarg[1], &par_trk[0], &par_trk[1], &par_trk_all, &par_trk_inv)) { 695 713 return (1); 696 714 } 697 715 698 - if (psi_parse_range (optarg[2], &par_sct[0], &par_sct[1], &par_sct_all)) { 716 + if (psi_parse_range (optarg[2], &par_sct[0], &par_sct[1], &par_sct_all, &par_sct_inv)) { 699 717 return (1); 700 718 } 701 719 break; 702 720 703 721 case 's': 704 - if (psi_parse_range (optarg[0], &par_sct[0], &par_sct[1], &par_sct_all)) { 722 + if (psi_parse_range (optarg[0], &par_sct[0], &par_sct[1], &par_sct_all, &par_sct_inv)) { 705 723 return (1); 706 724 } 707 725 break; 708 726 709 727 case 'S': 710 - if (psi_parse_range (optarg[0], &par_rsc[0], &par_rsc[1], &par_rsc_all)) { 728 + if (psi_parse_range (optarg[0], &par_rsc[0], &par_rsc[1], &par_rsc_all, &par_rsc_inv)) { 711 729 return (1); 712 730 } 713 731 break; 714 732 715 733 case 'v': 716 734 par_verbose = 1; 735 + break; 736 + 737 + case 'x': 738 + par_invert = !par_invert; 717 739 break; 718 740 719 741 case 0:
+5 -6
src/utils/psi/main.h
··· 53 53 extern unsigned par_filler; 54 54 extern unsigned long par_cnt; 55 55 56 - extern int par_cyl_all; 56 + extern char par_cyl_all; 57 57 extern unsigned par_cyl[2]; 58 58 59 - extern int par_trk_all; 59 + extern char par_trk_all; 60 60 extern unsigned par_trk[2]; 61 61 62 - extern int par_sct_all; 62 + extern char par_sct_all; 63 63 extern unsigned par_sct[2]; 64 64 65 - extern int par_rsc_all; 65 + extern char par_rsc_all; 66 66 extern unsigned par_rsc[2]; 67 67 68 - extern int par_alt_all; 68 + extern char par_alt_all; 69 69 extern unsigned par_alt[2]; 70 - 71 70 72 71 int psi_parse_int_list (const char **str, unsigned *val); 73 72
+4
src/utils/psi/psi.1
··· 272 272 Enable verbose operation. 273 273 \ 274 274 .TP 275 + .B "-x, --invert" 276 + Invert the selection. 277 + \ 278 + .TP 275 279 .B --help 276 280 Print usage information. 277 281 \