X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=src%2Fdata%2Fsession.c;h=56aa31a91cd581036890e312c04bb83bdd30de5b;hb=refs%2Fbuilds%2F20130615010505%2Fpspp;hp=a308ec1f624befa7c8e302c656944274bd82cc0d;hpb=bea8b007855970c07083dbec5b5cc90f33990957;p=pspp diff --git a/src/data/session.c b/src/data/session.c index a308ec1f62..56aa31a91c 100644 --- a/src/data/session.c +++ b/src/data/session.c @@ -1,5 +1,5 @@ /* PSPP - a program for statistical analysis. - Copyright (C) 2010, 2011, 2012 Free Software Foundation, Inc. + Copyright (C) 2010, 2011, 2012, 2013 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -25,6 +25,7 @@ #include "libpspp/assertion.h" #include "libpspp/cast.h" #include "libpspp/hash-functions.h" +#include "libpspp/i18n.h" #include "libpspp/str.h" #include "libpspp/hmapx.h" @@ -32,6 +33,7 @@ struct session { + struct session *parent; struct hmapx datasets; struct dataset *active; char *syntax_encoding; /* Default encoding for syntax files. */ @@ -42,14 +44,16 @@ static struct hmapx_node *session_lookup_dataset__ (const struct session *, const char *name); struct session * -session_create (void) +session_create (struct session *parent) { struct session *s; s = xmalloc (sizeof *s); + s->parent = parent; hmapx_init (&s->datasets); s->active = NULL; - s->syntax_encoding = xstrdup ("Auto"); + s->syntax_encoding = xstrdup (s->parent != NULL + ? s->parent->syntax_encoding : "Auto"); s->n_dataset_names = 0; return s; } @@ -94,7 +98,8 @@ session_add_dataset (struct session *s, struct dataset *ds) if (old != NULL) session_remove_dataset (s, old); - hmapx_insert (&s->datasets, ds, hash_case_string (dataset_name (ds), 0)); + hmapx_insert (&s->datasets, ds, + utf8_hash_case_string (dataset_name (ds), 0)); if (s->active == NULL) s->active = ds; @@ -113,7 +118,9 @@ struct dataset * session_lookup_dataset (const struct session *s, const char *name) { struct hmapx_node *node = session_lookup_dataset__ (s, name); - return node != NULL ? node->data : NULL; + return (node != NULL ? node->data + : s->parent != NULL ? session_lookup_dataset (s->parent, name) + : NULL); } struct dataset * @@ -193,8 +200,9 @@ session_lookup_dataset__ (const struct session *s_, const char *name) struct hmapx_node *node; struct dataset *ds; - HMAPX_FOR_EACH_WITH_HASH (ds, node, hash_case_string (name, 0), &s->datasets) - if (!strcasecmp (dataset_name (ds), name)) + HMAPX_FOR_EACH_WITH_HASH (ds, node, utf8_hash_case_string (name, 0), + &s->datasets) + if (!utf8_strcasecmp (dataset_name (ds), name)) return node; return NULL;