• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <unistd.h>
5 #include <signal.h>
6 #include <dirent.h>
7 #include <sys/types.h>
8 #include <pwd.h>
9 #include <err.h>
10 
11 #include "../cpuset_lib/common.h"
12 #include "../cpuset_lib/bitmask.h"
13 
14 #define MAX_STRING_SIZE	400
15 #define MAX_NBITS	1024
16 
17 #define USAGE  ("Usage : %s [-a|s] list1 [list2]\n"			\
18 		"\t-a|s   list1 add/subtract list2."			\
19 		"[default: -a]\n"					\
20 		"\t-h     Help.\n")
21 int add_or_subtract;
22 int convert;
23 
usage(char * prog_name,int status)24 static void usage(char *prog_name, int status)
25 {
26 	fprintf(stderr, USAGE, prog_name);
27 	exit(1);
28 }
29 
checkopt(int argc,char ** argv)30 static void checkopt(int argc, char **argv)
31 {
32 	char c = '\0';
33 	int optc = 0;
34 
35 	while ((c = getopt(argc, argv, "ahs")) != -1) {
36 		switch (c) {
37 		case 'a':
38 			add_or_subtract = 0;
39 			optc++;
40 			break;
41 		case 'h':	/* help */
42 			usage(argv[0], 0);
43 			break;
44 		case 's':
45 			add_or_subtract = 1;
46 			optc++;
47 			break;
48 		default:
49 			usage(argv[0], 1);
50 			break;
51 		}
52 	}
53 
54 	if (optc == 2)
55 		OPT_COLLIDING(argv[0], 'a', 's');
56 
57 	if (argc == optc + 1) {
58 		fprintf(stderr, "%s: missing the argument list1.\n", argv[0]);
59 		usage(argv[0], 1);
60 	} else if (argc == optc + 2)
61 		convert = 1;
62 }
63 
main(int argc,char ** argv)64 int main(int argc, char **argv)
65 {
66 	struct bitmask *mask1 = NULL, *mask2 = NULL, *mask3 = NULL;
67 	char buff[MAX_STRING_SIZE];
68 
69 	checkopt(argc, argv);
70 
71 	mask1 = bitmask_alloc(MAX_NBITS);
72 	if (mask1 == NULL)
73 		err(EXIT_FAILURE, "alloc memory space for bitmask1 failed.");
74 
75 	mask2 = bitmask_alloc(MAX_NBITS);
76 	if (mask2 == NULL)
77 		err(EXIT_FAILURE, "alloc memory space for bitmask2 failed.");
78 
79 	mask3 = bitmask_alloc(MAX_NBITS);
80 	if (mask3 == NULL)
81 		err(EXIT_FAILURE, "alloc memory space for bitmask3 failed.");
82 
83 	if (bitmask_parselist(argv[argc - 2 + convert], mask1) != 0)
84 		err(EXIT_FAILURE, "parse list1 string failed.");
85 
86 	if (convert) {
87 		bitmask_displaylist(buff, MAX_STRING_SIZE, mask1);
88 		printf("%s\n", buff);
89 		exit(0);
90 	}
91 
92 	if (bitmask_parselist(argv[argc - 1], mask2) != 0)
93 		err(EXIT_FAILURE, "parse list2 string failed.");
94 
95 	if (add_or_subtract)
96 		bitmask_andnot(mask3, mask1, mask2);
97 	else
98 		bitmask_or(mask3, mask1, mask2);
99 
100 	bitmask_displaylist(buff, MAX_STRING_SIZE, mask3);
101 	printf("%s\n", buff);
102 
103 	return 0;
104 }
105