source: abuse/trunk/src/property.cpp @ 494

Last change on this file since 494 was 494, checked in by Sam Hocevar, 11 years ago

style: remove trailing spaces, fix copyright statements.

File size: 3.4 KB
Line 
1/*
2 *  Abuse - dark 2D side-scrolling platform game
3 *  Copyright (c) 1995 Crack dot Com
4 *  Copyright (c) 2005-2011 Sam Hocevar <sam@hocevar.net>
5 *
6 *  This software was released into the Public Domain. As with most public
7 *  domain software, no warranty is made or implied by Crack dot Com or
8 *  Jonathan Clark.
9 */
10
11#include "config.h"
12
13#include <stdio.h>
14#include <string.h>
15
16#include "property.h"
17#include "dprint.h"
18#include "game.h"
19
20class property
21{
22  public :
23  char *name;
24  char *def_str;
25  int def_num;
26  property(char const *Name, int Def)
27  { name = strdup(Name);
28    def_num = Def;
29    def_str = NULL;
30    next = NULL;
31  }
32
33  property(char const *Name, char const *Def)
34  { name = strdup(Name);
35    def_str = strdup(Def);
36    next = NULL;
37  }
38
39  void set(int x)
40  { if (def_str)
41    {
42      free(def_str);
43      def_str=NULL;
44    }
45    def_num=x;
46  }
47
48  void set(char const *x)
49  {
50    if (def_str)
51    {
52      free(def_str);
53      def_str=NULL;
54    }
55    def_str = strdup(x);
56  }
57
58  ~property()
59  {
60    if (def_str)
61      free(def_str);
62    free(name);
63  }
64  property *next;
65} ;
66
67property *property_manager::find(char const *name)
68{
69  for (property *i=first; i; i=i->next)
70    if (!strcmp(i->name,name))
71      return i;
72  return NULL;
73}
74
75
76property_manager::~property_manager()
77{
78  while (first)
79  {
80    property *i=first;
81    first=first->next;
82    delete i;
83  }
84}
85
86int property_manager::get(char const *name, int def)
87{
88  property *f=find(name);
89  if (!f || f->def_str)
90    return def;
91  else return f->def_num;
92}
93
94
95char const *property_manager::get(char const *name,char const *def)
96{
97  property *f=find(name);
98  if (!f || !f->def_str)
99    return def;
100  else return f->def_str;
101}
102
103
104void property_manager::set(char const *name, double def)
105{
106  property *f=find(name);
107  if (f)
108    f->set((int)def);
109  else
110  {
111    f=new property(name,(int)def);
112    f->next=first;
113    first=f;
114  }
115}
116
117void property_manager::set(char const *name, char const *def)
118{
119  property *f=find(name);
120  if (f)
121    f->set(def);
122  else
123  {
124    f=new property(name,def);
125    f->next=first;
126    first=f;
127  }
128}
129
130
131void property_manager::save(char const *filename)
132{
133  FILE *fp=open_FILE(filename,"wb");
134  if (!fp)
135    dprintf("Error opening %s to save properties\n",filename);
136  else
137  {
138    for (property *i=first; i; i=i->next)
139    {
140      fprintf(fp,"%s = ",i->name);
141      if (i->def_str)
142        fprintf(fp,"\"%s\"\n",i->def_str);
143      else
144        fprintf(fp,"%d\n",i->def_num);
145    }
146    fclose(fp);
147  }
148}
149
150
151void property_manager::load(char const *filename)
152{
153  char buf[100],*c1,*c2,name[100],str[100];
154  FILE *fp=open_FILE(filename,"rb");
155  if (fp)
156  {
157    while (!feof(fp))
158    {
159      if (fgets(buf,100,fp))
160      {
161    for (c1=buf,c2=name; *c1 && *c1!='='; c1++,c2++)
162      *c2=*c1;
163    if (*c1==0) { fprintf(stderr,"Missing = for property line %s in file %s\n",buf,filename);
164              exit(1); }
165    *c2=' ';
166    while (*c2==' ') { *c2=0; c2--; }
167    c1++; while (*c1==' ') c1++;
168    if (*c1=='"')
169    { c1++;
170      for (c2=str; *c1 && *c1!='"'; c1++,c2++)
171        *c2=*c1;
172      *c2=0;
173      if (*c1!='"') { fprintf(stderr,"Missing \" for property name %s in file %s\n",name,filename);
174              exit(1); }
175      set(name,str);
176    } else
177    {
178      double x;
179      if (sscanf(c1,"%lg",&x))
180        set(name,x);
181      else
182      {
183        fprintf(stderr,"Bad number/string for property name %s in file %s\n",name,filename);
184        exit(1);
185      }
186    }
187      }
188    }
189  }
190}
Note: See TracBrowser for help on using the repository browser.