Lines Matching refs:space
63 struct space { struct
81 static void Perror(struct space *space, const char *fmt, ...) in Perror() argument
85 fprintf(stderr, "%s:%i: ", space->filename, space->linenum); in Perror()
96 static void free_space(struct space *space) in free_space() argument
98 struct pair *pair = space->pairs; in free_space()
108 space->pairs = NULL; in free_space()
109 if (space->ctl_value) { in free_space()
110 snd_ctl_elem_value_free(space->ctl_value); in free_space()
111 space->ctl_value = NULL; in free_space()
113 if (space->ctl_info) { in free_space()
114 snd_ctl_elem_info_free(space->ctl_info); in free_space()
115 space->ctl_info = NULL; in free_space()
117 if (space->ctl_id) { in free_space()
118 snd_ctl_elem_id_free(space->ctl_id); in free_space()
119 space->ctl_id = NULL; in free_space()
121 if (space->ctl_card_info) { in free_space()
122 snd_ctl_card_info_free(space->ctl_card_info); in free_space()
123 space->ctl_card_info = NULL; in free_space()
125 if (space->ctl_handle) { in free_space()
126 snd_hctl_close(space->ctl_handle); in free_space()
127 space->ctl_handle = NULL; in free_space()
129 if (space->rootdir) in free_space()
130 free(space->rootdir); in free_space()
131 if (space->program_result) in free_space()
132 free(space->program_result); in free_space()
133 if (space->go_to) in free_space()
134 free(space->go_to); in free_space()
135 free(space); in free_space()
138 static struct pair *value_find(struct space *space, const char *key) in value_find() argument
140 struct pair *pair = space->pairs; in value_find()
147 static int value_set(struct space *space, const char *key, const char *value) in value_set() argument
151 pair = value_find(space, key); in value_set()
172 pair->next = space->pairs; in value_set()
173 space->pairs = pair; in value_set()
178 static int init_space(struct space **space, int card) in init_space() argument
180 struct space *res; in init_space()
184 res = calloc(1, sizeof(struct space)); in init_space()
211 *space = res; in init_space()
218 static const char *cardinfo_get(struct space *space, const char *attr) in cardinfo_get() argument
222 sprintf(res, "%u", snd_ctl_card_info_get_card(space->ctl_card_info)); in cardinfo_get()
226 return snd_ctl_card_info_get_id(space->ctl_card_info); in cardinfo_get()
228 return snd_ctl_card_info_get_driver(space->ctl_card_info); in cardinfo_get()
230 return snd_ctl_card_info_get_name(space->ctl_card_info); in cardinfo_get()
232 return snd_ctl_card_info_get_longname(space->ctl_card_info); in cardinfo_get()
234 return snd_ctl_card_info_get_mixername(space->ctl_card_info); in cardinfo_get()
236 return snd_ctl_card_info_get_components(space->ctl_card_info); in cardinfo_get()
237 Perror(space, "unknown cardinfo{} attribute '%s'", attr); in cardinfo_get()
241 static int check_id_changed(struct space *space, unsigned int what) in check_id_changed() argument
246 if ((space->ctl_id_changed & what & 1) != 0) { in check_id_changed()
247 snd_ctl_elem_id_set_numid(space->ctl_id, 0); in check_id_changed()
248 elem = snd_hctl_find_elem(space->ctl_handle, space->ctl_id); in check_id_changed()
251 err = snd_hctl_elem_info(elem, space->ctl_info); in check_id_changed()
253 space->ctl_id_changed &= ~1; in check_id_changed()
256 if ((space->ctl_id_changed & what & 2) != 0) { in check_id_changed()
257 snd_ctl_elem_id_set_numid(space->ctl_id, 0); in check_id_changed()
258 elem = snd_hctl_find_elem(space->ctl_handle, space->ctl_id); in check_id_changed()
261 err = snd_hctl_elem_read(elem, space->ctl_value); in check_id_changed()
263 space->ctl_id_changed &= ~2; in check_id_changed()
269 static const char *get_ctl_value(struct space *space) in get_ctl_value() argument
278 type = snd_ctl_elem_info_get_type(space->ctl_info); in get_ctl_value()
279 count = snd_ctl_elem_info_get_count(space->ctl_info); in get_ctl_value()
286 strlcat(res, snd_ctl_elem_value_get_boolean(space->ctl_value, idx) ? "on" : "off", sizeof(res)); in get_ctl_value()
293 snprintf(tmp, sizeof(tmp), "%li", snd_ctl_elem_value_get_integer(space->ctl_value, idx)); in get_ctl_value()
301 snprintf(tmp, sizeof(tmp), "%lli", snd_ctl_elem_value_get_integer64(space->ctl_value, idx)); in get_ctl_value()
309 snprintf(tmp, sizeof(tmp), "%u", snd_ctl_elem_value_get_enumerated(space->ctl_value, idx)); in get_ctl_value()
320 pos1 = snd_ctl_elem_value_get_bytes(space->ctl_value); in get_ctl_value()
330 Perror(space, "unknown element type '%i'", type); in get_ctl_value()
340 static int set_ctl_value(struct space *space, const char *value, int all) in set_ctl_value() argument
349 type = snd_ctl_elem_info_get_type(space->ctl_info); in set_ctl_value()
350 count = snd_ctl_elem_info_get_count(space->ctl_info); in set_ctl_value()
362 snd_ctl_elem_value_set_boolean(space->ctl_value, idx, val); in set_ctl_value()
379 …1(strtol(value, NULL, 0), snd_ctl_elem_info_get_min(space->ctl_info), snd_ctl_elem_info_get_max(sp… in set_ctl_value()
380 snd_ctl_elem_value_set_integer(space->ctl_value, idx, val); in set_ctl_value()
396 val = snd_ctl_convert_from_dB(snd_hctl_ctl(space->ctl_handle), space->ctl_id, val, &lval, -1); in set_ctl_value()
401 snd_ctl_elem_value_set_integer(space->ctl_value, idx, lval); in set_ctl_value()
403 snd_ctl_elem_value_set_integer(space->ctl_value, idx, strtol(value, NULL, 0)); in set_ctl_value()
414 snd_ctl_elem_value_set_integer64(space->ctl_value, idx, strtoll(value, NULL, 0)); in set_ctl_value()
427 snd_ctl_elem_value_set_enumerated(space->ctl_value, idx, strtol(value, NULL, 0)); in set_ctl_value()
432 items = snd_ctl_elem_info_get_items(space->ctl_info); in set_ctl_value()
434 snd_ctl_elem_info_set_item(space->ctl_info, idx2); in set_ctl_value()
435 elem = snd_hctl_find_elem(space->ctl_handle, space->ctl_id); in set_ctl_value()
438 val = snd_hctl_elem_info(elem, space->ctl_info); in set_ctl_value()
441 if (strcasecmp(snd_ctl_elem_info_get_item_name(space->ctl_info), value) == 0) { in set_ctl_value()
442 snd_ctl_elem_value_set_enumerated(space->ctl_value, idx, idx2); in set_ctl_value()
447 Perror(space, "wrong enum identifier '%s'", value); in set_ctl_value()
463 Perror(space, "bad ctl value hexa length (should be %u bytes)", count); in set_ctl_value()
470 Perror(space, "bad ctl hexa value"); in set_ctl_value()
474 snd_ctl_elem_value_set_byte(space->ctl_value, idx, val); in set_ctl_value()
478 Perror(space, "unknown element type '%i'", type); in set_ctl_value()
483 Perror(space, "missing some ctl values (line %i)", space->linenum); in set_ctl_value()
527 static const char *elemid_get(struct space *space, const char *attr) in elemid_get() argument
534 val = snd_ctl_elem_id_get_numid(space->ctl_id); in elemid_get()
539 return snd_ctl_elem_iface_name(snd_ctl_elem_id_get_interface(space->ctl_id)); in elemid_get()
541 val = snd_ctl_elem_id_get_device(space->ctl_id); in elemid_get()
545 val = snd_ctl_elem_id_get_subdevice(space->ctl_id); in elemid_get()
549 return snd_ctl_elem_id_get_name(space->ctl_id); in elemid_get()
551 val = snd_ctl_elem_id_get_index(space->ctl_id); in elemid_get()
555 if (check_id_changed(space, 1)) in elemid_get()
557 return snd_ctl_elem_type_name(snd_ctl_elem_info_get_type(space->ctl_info)); in elemid_get()
560 if (check_id_changed(space, 1)) in elemid_get()
563 if (snd_ctl_elem_info_is_readable(space->ctl_info)) in elemid_get()
565 if (snd_ctl_elem_info_is_writable(space->ctl_info)) in elemid_get()
567 if (snd_ctl_elem_info_is_volatile(space->ctl_info)) in elemid_get()
569 if (snd_ctl_elem_info_is_inactive(space->ctl_info)) in elemid_get()
571 if (snd_ctl_elem_info_is_locked(space->ctl_info)) in elemid_get()
573 if (snd_ctl_elem_info_is_tlv_readable(space->ctl_info)) in elemid_get()
575 if (snd_ctl_elem_info_is_tlv_writable(space->ctl_info)) in elemid_get()
577 if (snd_ctl_elem_info_is_tlv_commandable(space->ctl_info)) in elemid_get()
579 if (snd_ctl_elem_info_is_owner(space->ctl_info)) in elemid_get()
581 if (snd_ctl_elem_info_is_user(space->ctl_info)) in elemid_get()
586 if (check_id_changed(space, 1)) in elemid_get()
588 val = snd_ctl_elem_info_get_owner(space->ctl_info); in elemid_get()
592 if (check_id_changed(space, 1)) in elemid_get()
594 val = snd_ctl_elem_info_get_count(space->ctl_info); in elemid_get()
598 if (check_id_changed(space, 1)) in elemid_get()
600 type = snd_ctl_elem_info_get_type(space->ctl_info); in elemid_get()
602 val = snd_ctl_elem_info_get_min64(space->ctl_info); in elemid_get()
604 val = snd_ctl_elem_info_get_min(space->ctl_info); in elemid_get()
610 if (check_id_changed(space, 1)) in elemid_get()
612 type = snd_ctl_elem_info_get_type(space->ctl_info); in elemid_get()
614 val = snd_ctl_elem_info_get_max64(space->ctl_info); in elemid_get()
616 val = snd_ctl_elem_info_get_max(space->ctl_info); in elemid_get()
622 if (check_id_changed(space, 1)) in elemid_get()
624 type = snd_ctl_elem_info_get_type(space->ctl_info); in elemid_get()
626 val = snd_ctl_elem_info_get_step64(space->ctl_info); in elemid_get()
628 val = snd_ctl_elem_info_get_step(space->ctl_info); in elemid_get()
634 if (check_id_changed(space, 1)) in elemid_get()
636 if (snd_ctl_elem_info_get_type(space->ctl_info) == SND_CTL_ELEM_TYPE_ENUMERATED) in elemid_get()
637 val = snd_ctl_elem_info_get_items(space->ctl_info); in elemid_get()
646 if (check_id_changed(space, 3)) in elemid_get()
648 return get_ctl_value(space); in elemid_get()
652 if (check_id_changed(space, 1)) in elemid_get()
654 if (snd_ctl_get_dB_range(snd_hctl_ctl(space->ctl_handle), space->ctl_id, &min, &max) < 0) in elemid_get()
663 if (check_id_changed(space, 1)) in elemid_get()
665 if (snd_ctl_get_dB_range(snd_hctl_ctl(space->ctl_handle), space->ctl_id, &min, &max) < 0) in elemid_get()
673 if (check_id_changed(space, 1)) in elemid_get()
675 if (snd_ctl_elem_info_get_type(space->ctl_info) != SND_CTL_ELEM_TYPE_ENUMERATED) in elemid_get()
677 items = snd_ctl_elem_info_get_items(space->ctl_info); in elemid_get()
680 snd_ctl_elem_info_set_item(space->ctl_info, idx); in elemid_get()
681 elem = snd_hctl_find_elem(space->ctl_handle, space->ctl_id); in elemid_get()
684 if (snd_hctl_elem_info(elem, space->ctl_info) < 0) in elemid_get()
686 strlcat(res, snd_ctl_elem_info_get_item_name(space->ctl_info), sizeof(res)); in elemid_get()
701 elem = snd_hctl_first_elem(space->ctl_handle); in elemid_get()
704 if (!ctl_match(space->ctl_id, id)) in elemid_get()
711 snd_ctl_elem_id_copy(space->ctl_id, id); in elemid_get()
729 elem = snd_hctl_first_elem(space->ctl_handle); in elemid_get()
732 if (ctl_match(space->ctl_id, id)) in elemid_get()
741 Perror(space, "unknown ctl{} attribute '%s'", attr); in elemid_get()
748 static int elemid_set(struct space *space, const char *attr, const char *value) in elemid_set() argument
770 snd_ctl_elem_id_clear(space->ctl_id); in elemid_set()
773 snd_ctl_elem_id_clear(space->ctl_id); in elemid_set()
775 snd_ctl_elem_id_set_interface(space->ctl_id, -1); in elemid_set()
776 snd_ctl_elem_id_set_device(space->ctl_id, -1); in elemid_set()
777 snd_ctl_elem_id_set_subdevice(space->ctl_id, -1); in elemid_set()
778 snd_ctl_elem_id_set_name(space->ctl_id, "*"); in elemid_set()
779 snd_ctl_elem_id_set_index(space->ctl_id, -1); in elemid_set()
783 snd_ctl_elem_id_set_interface(space->ctl_id, iface); in elemid_set()
784 space->ctl_id_changed = ~0; in elemid_set()
788 Perror(space, "unknown control interface name '%s'", value); in elemid_set()
800 snd_ctl_elem_id_set_name(space->ctl_id, value); in elemid_set()
801 space->ctl_id_changed = ~0; in elemid_set()
810 err = check_id_changed(space, 1); in elemid_set()
812 Perror(space, "control element not found"); in elemid_set()
815 err = set_ctl_value(space, value, strncasecmp(attr, "values", 6) == 0); in elemid_set()
817 space->ctl_id_changed |= 2; in elemid_set()
819 space->ctl_id_changed &= ~2; in elemid_set()
820 snd_ctl_elem_value_set_id(space->ctl_value, space->ctl_id); in elemid_set()
821 err = snd_ctl_elem_write(snd_hctl_ctl(space->ctl_handle), space->ctl_value); in elemid_set()
823 Perror(space, "value write error: %s", snd_strerror(err)); in elemid_set()
829 Perror(space, "unknown CTL{} attribute '%s'", attr); in elemid_set()
833 fcn(space->ctl_id, val); in elemid_set()
834 space->ctl_id_changed = ~0; in elemid_set()
942 static char *get_key_attribute(struct space *space, char *str, char *res, size_t ressize) in get_key_attribute() argument
952 Perror(space, "missing closing brace for format"); in get_key_attribute()
966 static char *get_format_attribute(struct space *space, char **str) in get_format_attribute() argument
974 Perror(space, "missing closing brace for format"); in get_format_attribute()
986 static int get_format_len(struct space *space, char **str) in get_format_len() argument
998 Perror(space, "format parsing error '%s'", *str); in get_format_len()
1004 static void apply_format(struct space *space, char *string, size_t maxsize) in apply_format() argument
1075 len = get_format_len(space, &tail); in apply_format()
1089 attr = get_format_attribute(space, &tail); in apply_format()
1096 Perror(space, "missing identification parametr for cardinfo"); in apply_format()
1098 const char *value = cardinfo_get(space, attr); in apply_format()
1107 Perror(space, "missing identification parametr for ctl"); in apply_format()
1109 const char *value = elemid_get(space, attr); in apply_format()
1117 if (space->program_result == NULL) in apply_format()
1125 cpos = space->program_result; in apply_format()
1133 Perror(space, "requested part of result string not found"); in apply_format()
1146 strlcat(string, space->program_result, maxsize); in apply_format()
1147 dbg("substitute result string '%s'", space->program_result); in apply_format()
1152 Perror(space, "missing file parameter for attr"); in apply_format()
1157 pair = value_find(space, "sysfs_device"); in apply_format()
1173 Perror(space, "%i untrusted character(s) replaced" , count); in apply_format()
1200 pair = value_find(space, attr); in apply_format()
1206 Perror(space, "unknown substitution type=%i", type); in apply_format()
1243 int run_program1(struct space *space, in run_program1() argument
1248 const char *res = elemid_get(space, "do_search"); in run_program1()
1254 const char *res = elemid_get(space, "do_count"); in run_program1()
1260 Perror(space, "unknown buildin command '%s'", command0); in run_program1()
1264 static int parse(struct space *space, const char *filename);
1287 static int parse_line(struct space *space, char *line, size_t linesize) in parse_line() argument
1307 Perror(space, "invalid LABEL operation"); in parse_line()
1310 if (space->go_to && strcmp(space->go_to, value) == 0) { in parse_line()
1311 free(space->go_to); in parse_line()
1312 space->go_to = NULL; in parse_line()
1317 if (space->go_to) { in parse_line()
1318 dbg("skip (GOTO '%s')", space->go_to); in parse_line()
1323 attr = get_key_attribute(space, key + 3, string, sizeof(string)); in parse_line()
1325 Perror(space, "error parsing CTL attribute"); in parse_line()
1330 apply_format(space, result, sizeof(result)); in parse_line()
1332 err = elemid_set(space, attr, result); in parse_line()
1333 if (space->program_result) { in parse_line()
1334 free(space->program_result); in parse_line()
1335 space->program_result = NULL; in parse_line()
1338 space->program_result = strdup(string); in parse_line()
1340 if (space->program_result == NULL) in parse_line()
1345 apply_format(space, result, sizeof(result)); in parse_line()
1347 err = elemid_set(space, "values", result); in parse_line()
1353 temp = (char *)elemid_get(space, attr); in parse_line()
1359 Perror(space, "invalid CTL{} operation"); in parse_line()
1366 if (!do_match(key, op, value, space->program_result)) in parse_line()
1369 if (space->program_result) { in parse_line()
1370 free(space->program_result); in parse_line()
1371 space->program_result = NULL; in parse_line()
1374 apply_format(space, string, sizeof(string)); in parse_line()
1375 space->program_result = strdup(string); in parse_line()
1376 if (space->program_result == NULL) in parse_line()
1379 Perror(space, "invalid RESULT operation"); in parse_line()
1388 apply_format(space, string, sizeof(string)); in parse_line()
1389 if (space->program_result) { in parse_line()
1390 free(space->program_result); in parse_line()
1391 space->program_result = NULL; in parse_line()
1393 if (run_program(space, string, result, sizeof(result), NULL, space->log_run) != 0) { in parse_line()
1403 space->program_result = strdup(result); in parse_line()
1404 if (space->program_result == NULL) in parse_line()
1414 attr = get_key_attribute(space, key + 8, string, sizeof(string)); in parse_line()
1416 Perror(space, "error parsing CARDINFO attribute"); in parse_line()
1421 temp = (char *)cardinfo_get(space, attr); in parse_line()
1425 Perror(space, "invalid CARDINFO{} operation"); in parse_line()
1431 attr = get_key_attribute(space, key + 4, string, sizeof(string)); in parse_line()
1433 Perror(space, "error parsing ATTR attribute"); in parse_line()
1437 pair = value_find(space, "sysfs_device"); in parse_line()
1445 Perror(space, "invalid ATTR{} operation"); in parse_line()
1451 attr = get_key_attribute(space, key + 3, string, sizeof(string)); in parse_line()
1453 Perror(space, "error parsing ENV attribute"); in parse_line()
1464 apply_format(space, result, sizeof(result)); in parse_line()
1469 Perror(space, "invalid ENV{} operation"); in parse_line()
1476 Perror(space, "invalid GOTO operation"); in parse_line()
1479 space->go_to = strdup(value); in parse_line()
1480 if (space->go_to == NULL) { in parse_line()
1492 Perror(space, "invalid INCLUDE operation"); in parse_line()
1498 strlcpy(string, space->rootdir, sizeof(string)); in parse_line()
1502 rootdir = space->rootdir; in parse_line()
1503 go_to = space->go_to; in parse_line()
1504 filename = space->filename; in parse_line()
1505 linenum = space->linenum; in parse_line()
1507 Perror(space, "invalid filename '%s'", string); in parse_line()
1516 Perror(space, "invalid directory '%s'", string); in parse_line()
1524 space->go_to = NULL; in parse_line()
1525 space->rootdir = new_root_dir(string); in parse_line()
1527 if (space->rootdir) { in parse_line()
1528 err = parse(space, string); in parse_line()
1529 free(space->rootdir); in parse_line()
1532 if (space->go_to) { in parse_line()
1533 Perror(space, "unterminated GOTO '%s'", space->go_to); in parse_line()
1534 free(space->go_to); in parse_line()
1541 space->go_to = NULL; in parse_line()
1542 space->rootdir = new_root_dir(string); in parse_line()
1543 if (space->rootdir) { in parse_line()
1544 err = parse(space, string); in parse_line()
1545 free(space->rootdir); in parse_line()
1548 if (space->go_to) { in parse_line()
1549 Perror(space, "unterminated GOTO '%s'", space->go_to); in parse_line()
1550 free(space->go_to); in parse_line()
1553 space->go_to = go_to; in parse_line()
1554 space->rootdir = rootdir; in parse_line()
1555 space->filename = filename; in parse_line()
1556 space->linenum = linenum; in parse_line()
1557 if (space->quit) in parse_line()
1567 apply_format(space, string, sizeof(string)); in parse_line()
1572 strlcpy(string, space->rootdir, sizeof(string)); in parse_line()
1578 apply_format(space, string, sizeof(string)); in parse_line()
1587 Perror(space, "invalid ACCESS operation"); in parse_line()
1594 Perror(space, "invalid PRINT operation"); in parse_line()
1598 apply_format(space, string, sizeof(string)); in parse_line()
1604 Perror(space, "invalid ERROR operation"); in parse_line()
1608 apply_format(space, string, sizeof(string)); in parse_line()
1614 Perror(space, "invalid EXIT operation"); in parse_line()
1618 apply_format(space, string, sizeof(string)); in parse_line()
1621 space->exit_code = strtol(string, NULL, 0); in parse_line()
1622 space->quit = 1; in parse_line()
1626 attr = get_key_attribute(space, key + 6, string, sizeof(string)); in parse_line()
1628 Perror(space, "error parsing CONFIG attribute"); in parse_line()
1632 apply_format(space, result, sizeof(result)); in parse_line()
1634 err = value_set(space, attr, result); in parse_line()
1638 pair = value_find(space, attr); in parse_line()
1644 Perror(space, "invalid CONFIG{} operation"); in parse_line()
1649 Perror(space, "unknown key '%s'", key); in parse_line()
1654 Perror(space, "invalid rule"); in parse_line()
1658 static int parse(struct space *space, const char *filename) in parse() argument
1682 space->filename = filename; in parse()
1683 while (!err && pos < bufsize && !space->quit) { in parse()
1729 space->linenum = linenum; in parse()
1730 err = parse_line(space, line, linesize); in parse()
1739 space->filename = NULL; in parse()
1740 space->linenum = -1; in parse()
1743 return err ? err : -abs(space->exit_code); in parse()
1748 struct space *space; in init() local
1766 err = init_space(&space, iter.card); in init()
1769 space->rootdir = new_root_dir(filename); in init()
1770 if (space->rootdir != NULL) { in init()
1771 err = parse(space, filename); in init()
1778 free_space(space); in init()