X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=attribute.c;h=671ca056d4c0f65d501443a96e45a40fa780cd69;hp=b8d4a5938beb792e5e5c7ebca62548407a91d12a;hb=bd4ab2d82dec95a4deb2455c0e3394db3e0d3bc5;hpb=b90c61663c32cdc6cfc0e78070e2a94a14cb2f8e;ds=sidebyside diff --git a/attribute.c b/attribute.c index b8d4a593..671ca056 100644 --- a/attribute.c +++ b/attribute.c @@ -296,7 +296,7 @@ static int com_addatt_callback(const struct osl_object *query, __a_unused struct osl_object *result) { char *p = query->data; - uint64_t atts_added = 0; + unsigned atts_added = 0; int ret; while (p < (char *)query->data + query->size) { @@ -330,17 +330,13 @@ static int com_addatt_callback(const struct osl_object *query, if (ret < 0) return ret; greatest_att_bitnum = PARA_MAX(greatest_att_bitnum, bitnum); - atts_added |= 1 << bitnum; + atts_added++; p += strlen(p) + 1; } if (!atts_added) return 1; - atts_added = ~atts_added; - ret = audio_file_loop(&atts_added, logical_and_attribute); - if (ret < 0) - return ret; find_greatest_att_bitnum(); - return reload_current_mood(); /* FIXME: mood_reload() returns an error */ + return reload_current_mood(); /* FIXME: returns an error */ } int com_addatt(__a_unused int fd, int argc, char * const * const argv) @@ -353,19 +349,29 @@ int com_addatt(__a_unused int fd, int argc, char * const * const argv) struct remove_attribute_action_data { struct para_buffer pb; int num_removed; + uint64_t mask_of_removed_atts; }; static int remove_attribute(struct osl_table *table, struct osl_row *row, const char *name, void *data) { struct remove_attribute_action_data *raad = data; - int ret = osl_del_row(table, row); - if (ret < 0) + unsigned char bitnum; + int ret; + + ret = get_attribute_bitnum_by_name(name, &bitnum); + if (ret < 0) { para_printf(&raad->pb, "%s: %s\n", name, PARA_STRERROR(-ret)); - else { - para_printf(&raad->pb, "removed %s\n", name); - raad->num_removed++; + return 1; } + ret = osl_del_row(table, row); + if (ret < 0) { + para_printf(&raad->pb, "%s: %s\n", name, PARA_STRERROR(-ret)); + return 1; + } + para_printf(&raad->pb, "removed %s\n", name); + raad->num_removed++; + raad->mask_of_removed_atts |= (1 << bitnum); return 1; } @@ -386,6 +392,10 @@ static int com_rmatt_callback(const struct osl_object *query, if (ret < 0) para_printf(&raad.pb, "%s\n", PARA_STRERROR(-ret)); if (raad.num_removed) { + uint64_t and_mask = ~raad.mask_of_removed_atts; + ret = audio_file_loop(&and_mask, logical_and_attribute); + if (ret < 0) + para_printf(&raad.pb, "%s\n", PARA_STRERROR(-ret)); find_greatest_att_bitnum(); ret = reload_current_mood(); if (ret < 0)