summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilip Withnall <withnall@endlessm.com>2019-01-21 19:12:09 +0000
committerRichard Hughes <richard@hughsie.com>2019-01-23 15:56:25 +0000
commit872cdc8955cbf32ebb47f71f3f1108664a78913c (patch)
tree630812dd13d7818659e691f30d5675c7649f290b
parentf36d72cb588325f8bbd84c39737bb788acc1c43c (diff)
downloadappstream-glib-872cdc8955cbf32ebb47f71f3f1108664a78913c.tar.gz
as-content-rating: Restructure OARS → CSM mapping table
Make it more compact in lines of code and in memory. This introduces no functional changes (all the mappings should be the same), but it should make it harder to make typos when editing the table in future. Signed-off-by: Philip Withnall <withnall@endlessm.com> https://github.com/hughsie/appstream-glib/issues/280
-rw-r--r--libappstream-glib/as-content-rating.c191
1 files changed, 68 insertions, 123 deletions
diff --git a/libappstream-glib/as-content-rating.c b/libappstream-glib/as-content-rating.c
index 44969aa..d3d264f 100644
--- a/libappstream-glib/as-content-rating.c
+++ b/libappstream-glib/as-content-rating.c
@@ -218,132 +218,77 @@ as_content_rating_value_from_string (const gchar *value)
static guint
as_content_rating_id_value_to_csm_age (const gchar *id, AsContentRatingValue value)
{
- guint i;
+ /* The struct definition below assumes we don’t grow more
+ * #AsContentRating values. */
+ G_STATIC_ASSERT (AS_CONTENT_RATING_VALUE_LAST == AS_CONTENT_RATING_VALUE_INTENSE + 1);
+
struct {
- const gchar *id;
- AsContentRatingValue value;
- guint csm_age;
+ const gchar *id;
+ guint csm_age_none; /* for %AS_CONTENT_RATING_VALUE_NONE */
+ guint csm_age_mild; /* for %AS_CONTENT_RATING_VALUE_MILD */
+ guint csm_age_moderate; /* for %AS_CONTENT_RATING_VALUE_MODERATE */
+ guint csm_age_intense; /* for %AS_CONTENT_RATING_VALUE_INTENSE */
} to_csm_age[] = {
- /* v1.0 */
- { "violence-cartoon", AS_CONTENT_RATING_VALUE_NONE, 0 },
- { "violence-cartoon", AS_CONTENT_RATING_VALUE_MILD, 3 },
- { "violence-cartoon", AS_CONTENT_RATING_VALUE_MODERATE, 4 },
- { "violence-cartoon", AS_CONTENT_RATING_VALUE_INTENSE, 6 },
- { "violence-fantasy", AS_CONTENT_RATING_VALUE_NONE, 0 },
- { "violence-fantasy", AS_CONTENT_RATING_VALUE_MILD, 3 },
- { "violence-fantasy", AS_CONTENT_RATING_VALUE_MODERATE, 7 },
- { "violence-fantasy", AS_CONTENT_RATING_VALUE_INTENSE, 8 },
- { "violence-realistic", AS_CONTENT_RATING_VALUE_NONE, 0 },
- { "violence-realistic", AS_CONTENT_RATING_VALUE_MILD, 4 },
- { "violence-realistic", AS_CONTENT_RATING_VALUE_MODERATE, 9 },
- { "violence-realistic", AS_CONTENT_RATING_VALUE_INTENSE, 14 },
- { "violence-bloodshed", AS_CONTENT_RATING_VALUE_NONE, 0 },
- { "violence-bloodshed", AS_CONTENT_RATING_VALUE_MILD, 9 },
- { "violence-bloodshed", AS_CONTENT_RATING_VALUE_MODERATE, 11 },
- { "violence-bloodshed", AS_CONTENT_RATING_VALUE_INTENSE, 18 },
- { "violence-sexual", AS_CONTENT_RATING_VALUE_NONE, 0 },
- { "violence-sexual", AS_CONTENT_RATING_VALUE_MILD, 18 },
- { "violence-sexual", AS_CONTENT_RATING_VALUE_MODERATE, 18 },
- { "violence-sexual", AS_CONTENT_RATING_VALUE_INTENSE, 18 },
- { "drugs-alcohol", AS_CONTENT_RATING_VALUE_NONE, 0 },
- { "drugs-alcohol", AS_CONTENT_RATING_VALUE_MILD, 11 },
- { "drugs-alcohol", AS_CONTENT_RATING_VALUE_INTENSE, 16 },
- { "drugs-alcohol", AS_CONTENT_RATING_VALUE_MODERATE, 13 },
- { "drugs-narcotics", AS_CONTENT_RATING_VALUE_NONE, 0 },
- { "drugs-narcotics", AS_CONTENT_RATING_VALUE_MILD, 12 },
- { "drugs-narcotics", AS_CONTENT_RATING_VALUE_INTENSE, 17 },
- { "drugs-narcotics", AS_CONTENT_RATING_VALUE_MODERATE, 14 },
- { "drugs-tobacco", AS_CONTENT_RATING_VALUE_NONE, 0 },
- { "drugs-tobacco", AS_CONTENT_RATING_VALUE_MILD, 10 },
- { "drugs-tobacco", AS_CONTENT_RATING_VALUE_MODERATE, 13 },
- { "drugs-tobacco", AS_CONTENT_RATING_VALUE_INTENSE, 13 },
- { "sex-nudity", AS_CONTENT_RATING_VALUE_NONE, 0 },
- { "sex-nudity", AS_CONTENT_RATING_VALUE_MILD, 12 },
- { "sex-nudity", AS_CONTENT_RATING_VALUE_MODERATE, 14 },
- { "sex-nudity", AS_CONTENT_RATING_VALUE_INTENSE, 14 },
- { "sex-themes", AS_CONTENT_RATING_VALUE_NONE, 0 },
- { "sex-themes", AS_CONTENT_RATING_VALUE_MILD, 13 },
- { "sex-themes", AS_CONTENT_RATING_VALUE_MODERATE, 14 },
- { "sex-themes", AS_CONTENT_RATING_VALUE_INTENSE, 15 },
- { "language-profanity", AS_CONTENT_RATING_VALUE_NONE, 0 },
- { "language-profanity", AS_CONTENT_RATING_VALUE_MILD, 8 },
- { "language-profanity", AS_CONTENT_RATING_VALUE_MODERATE, 11 },
- { "language-profanity", AS_CONTENT_RATING_VALUE_INTENSE, 14 },
- { "language-humor", AS_CONTENT_RATING_VALUE_NONE, 0 },
- { "language-humor", AS_CONTENT_RATING_VALUE_MILD, 3 },
- { "language-humor", AS_CONTENT_RATING_VALUE_MODERATE, 8 },
- { "language-humor", AS_CONTENT_RATING_VALUE_INTENSE, 14 },
- { "language-discrimination", AS_CONTENT_RATING_VALUE_NONE, 0 },
- { "language-discrimination", AS_CONTENT_RATING_VALUE_MILD, 9 },
- { "language-discrimination", AS_CONTENT_RATING_VALUE_MODERATE, 10 },
- { "language-discrimination", AS_CONTENT_RATING_VALUE_INTENSE, 11 },
- { "money-advertising", AS_CONTENT_RATING_VALUE_NONE, 0 },
- { "money-advertising", AS_CONTENT_RATING_VALUE_MILD, 7 },
- { "money-advertising", AS_CONTENT_RATING_VALUE_MODERATE, 8 },
- { "money-advertising", AS_CONTENT_RATING_VALUE_INTENSE, 10 },
- { "money-gambling", AS_CONTENT_RATING_VALUE_NONE, 0 },
- { "money-gambling", AS_CONTENT_RATING_VALUE_MILD, 7 },
- { "money-gambling", AS_CONTENT_RATING_VALUE_MODERATE, 10 },
- { "money-gambling", AS_CONTENT_RATING_VALUE_INTENSE, 18 },
- { "money-purchasing", AS_CONTENT_RATING_VALUE_NONE, 0 },
- { "money-purchasing", AS_CONTENT_RATING_VALUE_INTENSE, 15 },
- { "social-chat", AS_CONTENT_RATING_VALUE_NONE, 0 },
- { "social-chat", AS_CONTENT_RATING_VALUE_MILD, 4 },
- { "social-chat", AS_CONTENT_RATING_VALUE_MODERATE, 10 },
- { "social-chat", AS_CONTENT_RATING_VALUE_INTENSE, 13 },
- { "social-audio", AS_CONTENT_RATING_VALUE_NONE, 0 },
- { "social-audio", AS_CONTENT_RATING_VALUE_MILD, 15 },
- { "social-audio", AS_CONTENT_RATING_VALUE_MODERATE, 15 },
- { "social-audio", AS_CONTENT_RATING_VALUE_INTENSE, 15 },
- { "social-contacts", AS_CONTENT_RATING_VALUE_NONE, 0 },
- { "social-contacts", AS_CONTENT_RATING_VALUE_MILD, 12 },
- { "social-contacts", AS_CONTENT_RATING_VALUE_MODERATE, 12 },
- { "social-contacts", AS_CONTENT_RATING_VALUE_INTENSE, 12 },
- { "social-info", AS_CONTENT_RATING_VALUE_NONE, 0 },
- { "social-info", AS_CONTENT_RATING_VALUE_INTENSE, 13 },
- { "social-location", AS_CONTENT_RATING_VALUE_NONE, 0 },
- { "social-location", AS_CONTENT_RATING_VALUE_MILD, 13 },
- { "social-location", AS_CONTENT_RATING_VALUE_MODERATE, 13 },
- { "social-location", AS_CONTENT_RATING_VALUE_INTENSE, 13 },
- /* v1.1 additions */
- { "social-info", AS_CONTENT_RATING_VALUE_MILD, 0 },
- { "social-info", AS_CONTENT_RATING_VALUE_MODERATE, 13 },
- { "money-purchasing", AS_CONTENT_RATING_VALUE_MILD, 12 },
- { "money-purchasing", AS_CONTENT_RATING_VALUE_MODERATE, 14 },
- { "sex-homosexuality", AS_CONTENT_RATING_VALUE_NONE, 0 },
- { "sex-homosexuality", AS_CONTENT_RATING_VALUE_MILD, 10 },
- { "sex-homosexuality", AS_CONTENT_RATING_VALUE_MODERATE, 13 },
- { "sex-homosexuality", AS_CONTENT_RATING_VALUE_INTENSE, 18 },
- { "sex-prostitution", AS_CONTENT_RATING_VALUE_NONE, 0 },
- { "sex-prostitution", AS_CONTENT_RATING_VALUE_MILD, 12 },
- { "sex-prostitution", AS_CONTENT_RATING_VALUE_MODERATE, 14 },
- { "sex-prostitution", AS_CONTENT_RATING_VALUE_INTENSE, 18 },
- { "sex-adultery", AS_CONTENT_RATING_VALUE_NONE, 0 },
- { "sex-adultery", AS_CONTENT_RATING_VALUE_MILD, 8 },
- { "sex-adultery", AS_CONTENT_RATING_VALUE_MODERATE, 10 },
- { "sex-adultery", AS_CONTENT_RATING_VALUE_INTENSE, 18 },
- { "sex-appearance", AS_CONTENT_RATING_VALUE_NONE, 0 },
- { "sex-appearance", AS_CONTENT_RATING_VALUE_MILD, 10 },
- { "sex-appearance", AS_CONTENT_RATING_VALUE_MODERATE, 10 },
- { "sex-appearance", AS_CONTENT_RATING_VALUE_INTENSE, 15 },
- { "violence-worship", AS_CONTENT_RATING_VALUE_NONE, 0 },
- { "violence-worship", AS_CONTENT_RATING_VALUE_MILD, 13 },
- { "violence-worship", AS_CONTENT_RATING_VALUE_MODERATE, 15 },
- { "violence-worship", AS_CONTENT_RATING_VALUE_INTENSE, 18 },
- { "violence-desecration", AS_CONTENT_RATING_VALUE_NONE, 0 },
- { "violence-desecration", AS_CONTENT_RATING_VALUE_MILD, 13 },
- { "violence-desecration", AS_CONTENT_RATING_VALUE_MODERATE, 15 },
- { "violence-desecration", AS_CONTENT_RATING_VALUE_INTENSE, 18 },
- { "violence-slavery", AS_CONTENT_RATING_VALUE_NONE, 0 },
- { "violence-slavery", AS_CONTENT_RATING_VALUE_MILD, 13 },
- { "violence-slavery", AS_CONTENT_RATING_VALUE_MODERATE, 15 },
- { "violence-slavery", AS_CONTENT_RATING_VALUE_INTENSE, 18 },
- { NULL, 0, 0 } };
- for (i = 0; to_csm_age[i].id != NULL; i++) {
- if (value == to_csm_age[i].value &&
- g_strcmp0 (id, to_csm_age[i].id) == 0)
- return to_csm_age[i].csm_age;
+ /* Each @id must only appear once. The set of @csm_age_* values for a
+ * given @id must be complete and non-decreasing. */
+ /* v1.0 */
+ { "violence-cartoon", 0, 3, 4, 6 },
+ { "violence-fantasy", 0, 3, 7, 8 },
+ { "violence-realistic", 0, 4, 9, 14 },
+ { "violence-bloodshed", 0, 9, 11, 18 },
+ { "violence-sexual", 0, 18, 18, 18 },
+ { "drugs-alcohol", 0, 11, 13, 16 },
+ { "drugs-narcotics", 0, 12, 14, 17 },
+ { "drugs-tobacco", 0, 10, 13, 13 },
+ { "sex-nudity", 0, 12, 14, 14 },
+ { "sex-themes", 0, 13, 14, 15 },
+ { "language-profanity", 0, 8, 11, 14 },
+ { "language-humor", 0, 3, 8, 14 },
+ { "language-discrimination", 0, 9, 10, 11 },
+ { "money-advertising", 0, 7, 8, 10 },
+ { "money-gambling", 0, 7, 10, 18 },
+ { "money-purchasing", 0, 12, 14, 15 },
+ { "social-chat", 0, 4, 10, 13 },
+ { "social-audio", 0, 15, 15, 15 },
+ { "social-contacts", 0, 12, 12, 12 },
+ { "social-info", 0, 0, 13, 13 },
+ { "social-location", 0, 13, 13, 13 },
+ /* v1.1 additions */
+ { "sex-homosexuality", 0, 10, 13, 18 },
+ { "sex-prostitution", 0, 12, 14, 18 },
+ { "sex-adultery", 0, 8, 10, 18 },
+ { "sex-appearance", 0, 10, 10, 15 },
+ { "violence-worship", 0, 13, 15, 18 },
+ { "violence-desecration", 0, 13, 15, 18 },
+ { "violence-slavery", 0, 13, 15, 18 },
+ };
+
+ if (value == AS_CONTENT_RATING_VALUE_UNKNOWN ||
+ value == AS_CONTENT_RATING_VALUE_LAST)
+ return 0;
+
+ for (gsize i = 0; i < G_N_ELEMENTS (to_csm_age); i++) {
+ if (g_str_equal (id, to_csm_age[i].id)) {
+ switch (value) {
+ case AS_CONTENT_RATING_VALUE_NONE:
+ return to_csm_age[i].csm_age_none;
+ case AS_CONTENT_RATING_VALUE_MILD:
+ return to_csm_age[i].csm_age_mild;
+ case AS_CONTENT_RATING_VALUE_MODERATE:
+ return to_csm_age[i].csm_age_moderate;
+ case AS_CONTENT_RATING_VALUE_INTENSE:
+ return to_csm_age[i].csm_age_intense;
+ case AS_CONTENT_RATING_VALUE_UNKNOWN:
+ case AS_CONTENT_RATING_VALUE_LAST:
+ default:
+ /* Handled above. */
+ g_assert_not_reached ();
+ return 0;
+ }
+ }
}
+
+ /* @id not found. */
return 0;
}