(scm_is_eq): New.
[bpt/guile.git] / libguile / keywords.c
CommitLineData
231a4ea8 1/* Copyright (C) 1995,1996,1997,1998,1999,2000,2001, 2003 Free Software Foundation, Inc.
fca75708 2 *
73be1d9e
MV
3 * This library is free software; you can redistribute it and/or
4 * modify it under the terms of the GNU Lesser General Public
5 * License as published by the Free Software Foundation; either
6 * version 2.1 of the License, or (at your option) any later version.
fca75708 7 *
73be1d9e
MV
8 * This library is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 * Lesser General Public License for more details.
fca75708 12 *
73be1d9e
MV
13 * You should have received a copy of the GNU Lesser General Public
14 * License along with this library; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
16 */
1bbd0b84 17
1bbd0b84 18
fca75708
MD
19\f
20
13070bd3
DH
21#include <string.h>
22
a0599745
MD
23#include "libguile/_scm.h"
24#include "libguile/ports.h"
25#include "libguile/root.h"
26#include "libguile/smob.h"
00ffa0e7 27#include "libguile/hashtab.h"
a0599745
MD
28
29#include "libguile/validate.h"
30#include "libguile/keywords.h"
fca75708
MD
31\f
32
92c2555f 33scm_t_bits scm_tc16_keyword;
e841c3e0 34
fca75708 35static int
e81d98ec 36keyword_print (SCM exp, SCM port, scm_print_state *pstate SCM_UNUSED)
fca75708 37{
bab246f3
DH
38 SCM symbol = SCM_KEYWORDSYM (exp);
39
fca75708 40 scm_puts ("#:", port);
bab246f3
DH
41 scm_print_symbol_name (SCM_SYMBOL_CHARS (symbol) + 1,
42 SCM_SYMBOL_LENGTH (symbol) - 1,
ca314021 43 port);
bab246f3 44 scm_remember_upto_here_1 (symbol);
fca75708
MD
45 return 1;
46}
47
a1ec6916 48SCM_DEFINE (scm_make_keyword_from_dash_symbol, "make-keyword-from-dash-symbol", 1, 0, 0,
1bbd0b84 49 (SCM symbol),
872e0c72 50 "Make a keyword object from a @var{symbol} that starts with a dash.")
1bbd0b84 51#define FUNC_NAME s_scm_make_keyword_from_dash_symbol
fca75708 52{
86d31dfe 53 SCM keyword;
fca75708 54
0b5f3f34 55 SCM_ASSERT (SCM_SYMBOLP (symbol)
86c991c2 56 && ('-' == SCM_SYMBOL_CHARS(symbol)[0]),
1bbd0b84 57 symbol, SCM_ARG1, FUNC_NAME);
fca75708
MD
58
59 SCM_DEFER_INTS;
86d31dfe
MV
60 keyword = scm_hashq_ref (scm_keyword_obarray, symbol, SCM_BOOL_F);
61 if (SCM_FALSEP (keyword))
fca75708 62 {
54778cd3 63 SCM_NEWSMOB (keyword, scm_tc16_keyword, SCM_UNPACK (symbol));
86d31dfe 64 scm_hashq_set_x (scm_keyword_obarray, symbol, keyword);
fca75708
MD
65 }
66 SCM_ALLOW_INTS;
86d31dfe 67 return keyword;
fca75708 68}
1bbd0b84 69#undef FUNC_NAME
fca75708 70
430a6cc3
MD
71SCM
72scm_c_make_keyword (char *s)
73{
4c9419ac 74 char *buf = scm_malloc (strlen (s) + 2);
85db4a2c
DH
75 SCM symbol;
76
430a6cc3
MD
77 buf[0] = '-';
78 strcpy (buf + 1, s);
85db4a2c 79 symbol = scm_str2symbol (buf);
4c9419ac 80 free (buf);
85db4a2c
DH
81
82 return scm_make_keyword_from_dash_symbol (symbol);
430a6cc3
MD
83}
84
3b3b36dd 85SCM_DEFINE (scm_keyword_p, "keyword?", 1, 0, 0,
da4a1dba 86 (SCM obj),
1e6808ea
MG
87 "Return @code{#t} if the argument @var{obj} is a keyword, else\n"
88 "@code{#f}.")
1bbd0b84 89#define FUNC_NAME s_scm_keyword_p
fca75708 90{
22a52da1 91 return SCM_BOOL (SCM_KEYWORDP (obj));
fca75708 92}
1bbd0b84 93#undef FUNC_NAME
fca75708
MD
94
95
3b3b36dd 96SCM_DEFINE (scm_keyword_dash_symbol, "keyword-dash-symbol", 1, 0, 0,
da4a1dba 97 (SCM keyword),
872e0c72
NJ
98 "Return the dash symbol for @var{keyword}.\n"
99 "This is the inverse of @code{make-keyword-from-dash-symbol}.")
1bbd0b84 100#define FUNC_NAME s_scm_keyword_dash_symbol
fca75708 101{
22a52da1
DH
102 SCM_VALIDATE_KEYWORD (1, keyword);
103 return SCM_KEYWORDSYM (keyword);
fca75708 104}
1bbd0b84 105#undef FUNC_NAME
fca75708
MD
106
107
108
109void
110scm_init_keywords ()
111{
e841c3e0
KN
112 scm_tc16_keyword = scm_make_smob_type ("keyword", 0);
113 scm_set_smob_mark (scm_tc16_keyword, scm_markcdr);
114 scm_set_smob_print (scm_tc16_keyword, keyword_print);
f5f2dcff 115
231a4ea8 116 scm_keyword_obarray = scm_c_make_hash_table (0);
a0599745 117#include "libguile/keywords.x"
fca75708
MD
118}
119
89e00824
ML
120
121/*
122 Local Variables:
123 c-file-style: "gnu"
124 End:
125*/