Changeset 5764:2305386b07ad in roaraudio for roarclients
- Timestamp:
- 11/21/12 15:57:16 (11 years ago)
- Branch:
- default
- Phase:
- public
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
roarclients/roar-config.c
r5748 r5764 53 53 }, * flags_ptr = NULL; 54 54 55 struct version { 56 int major, minor, revision; 57 }; 58 59 static struct version parse_version(const char * version) { 60 struct version ret = {-1, -1, -1}; 61 char * next; 62 63 if ( !strcasecmp(version, "current") ) 64 version = COMMON_VERSION; 65 66 ret.major = strtoll(version, &next, 0); 67 ret.minor = strtoll(next+1, &next, 0); 68 ret.revision = strtoll(next+1, &next, 0); 69 70 return ret; 71 } 72 73 static int compare_versions_eq(struct version a, struct version b) { 74 return a.major == b.major && a.minor == b.minor && a.revision == b.revision; 75 } 76 77 static int compare_versions_gt(struct version a, struct version b) { 78 if ( a.major > b.major ) 79 return 1; 80 if ( a.minor > b.minor ) 81 return 1; 82 if ( a.revision > b.revision ) 83 return 1; 84 return 0; 85 } 86 87 static int compare_versions_ge(struct version a, struct version b) { 88 return compare_versions_gt(a, b) || compare_versions_eq(a, b); 89 } 90 91 static int compare_versions_lt(struct version a, struct version b) { 92 return compare_versions_gt(b, a); 93 } 94 95 static int compare_versions_le(struct version a, struct version b) { 96 return compare_versions_lt(a, b) || compare_versions_eq(a, b); 97 } 98 99 static const struct { 100 const char * op; 101 int neg; 102 int (*func)(struct version a, struct version b); 103 } compare_versions_funcs[] = { 104 {"eq", 0, compare_versions_eq}, 105 {"ne", 1, compare_versions_eq}, 106 {"gt", 0, compare_versions_gt}, 107 {"ge", 0, compare_versions_ge}, 108 {"lt", 0, compare_versions_lt}, 109 {"le", 0, compare_versions_le} 110 }; 111 112 static int compare_versions(const char * a, const char * op, const char * b) { 113 struct version va = parse_version(a); 114 struct version vb = parse_version(b); 115 size_t i; 116 int ret; 117 118 ROAR_DBG("compare_versions(a='%s', op='%s', b='%s'): {%i, %i, %i} <%s> {%i, %i, %i}\n", a, op, b, va.major, va.minor, va.revision, op, vb.major, vb.minor, vb.revision); 119 120 for (i = 0; i < (sizeof(compare_versions_funcs)/sizeof(*compare_versions_funcs)); i++) { 121 if ( !strcasecmp(compare_versions_funcs[i].op, op) ) { 122 ret = compare_versions_funcs[i].func(va, vb); 123 if ( compare_versions_funcs[i].neg ) 124 ret = ret ? 0 : 1; 125 126 return ret ? 0 : 32; 127 } 128 } 129 130 ROAR_ERR("compare_versions(*): Operator \"%s\" not found.", op); 131 return 1; 132 } 133 55 134 void print_path(const char * name, int null_as_universal, const char * product, const char * provider) { 56 135 char * path = roar_libroar_get_path(name, null_as_universal, product, provider); … … 63 142 void usage (void) { 64 143 printf("Usage: roar-config --version\n" 144 " roar-config --compare-versions VERSIONA OPERATOR VERSIONB\n" 65 145 " roar-config [{--output-pc|--output-normal}] [--libs] [--cflags] [LIB]\n" 66 146 " roar-config [--product PRODUCT] [--provider PROVIDER] [--universal] --path PATH\n"); … … 70 150 printf( 71 151 " --version - Show version of library\n" 152 " --compare-versions A OP B\n" 153 " - Compare version A against B with operator OP.\n" 72 154 " --path NAME - Print path NAME\n" 73 155 " --product PRODUCT - Product string for --path\n" … … 105 187 usage(); 106 188 return 0; 189 } else if ( !strcmp(argv[i], "--compare-versions") ) { 190 return compare_versions(argv[i+1], argv[i+2], argv[i+3]); 107 191 } else if ( !strcmp(argv[i], "--product") ) { 108 192 product = argv[++i];
Note: See TracChangeset
for help on using the changeset viewer.