acpc_dealer 2.1.3 → 2.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/acpc_dealer.rb +15 -0
- data/lib/acpc_dealer/version.rb +1 -1
- data/vendor/project_acpc_server/example_player.kuhn.limit.3p.sh +2 -0
- data/vendor/project_acpc_server/game.c +0 -1
- data/vendor/project_acpc_server/game.o +0 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player.sf1.sh +1 -1
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player.sf2.sh +1 -1
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player.sf3.sh +1 -1
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/README.md +14 -14
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/src/dealer_connection.c +8 -8
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/src/dealer_connection.h +1 -1
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/src/kuhn_3p_equilibrium_player.c +9 -9
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/src/kuhn_3p_equilibrium_player.h +8 -7
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cexception/docs/license.txt +29 -29
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cexception/docs/readme.txt +242 -242
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/unity/docs/Unity Summary.txt +216 -216
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/unity/docs/license.txt +30 -30
- data/vendor/project_acpc_server/net.h +1 -1
- data/vendor/project_acpc_server/rng.o +0 -0
- metadata +59 -56
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6efdce0a35fe154dc42128ecbb0c0178d25ca739
|
4
|
+
data.tar.gz: 0575059959d08e372dcc0e8b071d5301f54a3a04
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4879476724145fb209baab610e1b55e34e60455f6014b1e8224e942d4465a84ae4b9a457c62e99232407297284c24161a97e83442c177c27a3afd94174020c08
|
7
|
+
data.tar.gz: 7e7eb6a63b6dfed32a17da8ea70bf4d0df1ca3cf86550e45942a84f066e497f2393ad51b2c98c030e98158a22802a776badcfd552be4717e003cd14ed24021cf
|
data/lib/acpc_dealer.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'hand_evaluator'
|
2
2
|
require "acpc_dealer/dealer_runner"
|
3
|
+
require 'date'
|
3
4
|
|
4
5
|
module AcpcDealer
|
5
6
|
VENDOR_DIRECTORY = File.expand_path('../../vendor', __FILE__)
|
@@ -41,4 +42,18 @@ module AcpcDealer
|
|
41
42
|
super port_number, host_name
|
42
43
|
end
|
43
44
|
end
|
45
|
+
|
46
|
+
def self.game_def_label(number_of_players, betting_type_key)
|
47
|
+
"#{number_of_players}P-#{betting_type_key}"
|
48
|
+
end
|
49
|
+
|
50
|
+
def self.default_match_name(players, game_def, seed)
|
51
|
+
"#{players.join('-')}.#{game_def}.r#{seed}.#{date}"
|
52
|
+
end
|
53
|
+
|
54
|
+
private
|
55
|
+
|
56
|
+
def self.date
|
57
|
+
"#{Date.today.strftime('%b%-d_%Y').downcase}"
|
58
|
+
end
|
44
59
|
end
|
data/lib/acpc_dealer/version.rb
CHANGED
Binary file
|
@@ -1,3 +1,3 @@
|
|
1
1
|
#!/bin/bash
|
2
2
|
THIS_DIR=$( cd "$( dirname "$0" )" && pwd )
|
3
|
-
cd $THIS_DIR && ./kuhn_3p_equilibrium_player/kuhn_3p_equilibrium_player -n $1 -p $2 --c11 0.0 --b11 0.25 --b21 0.25 --b32 0.9375 --c33 0.0 --c34 1.0 -g kuhn.limit.3p.game
|
3
|
+
cd $THIS_DIR && ./kuhn_3p_equilibrium_player/kuhn_3p_equilibrium_player -n $1 -p $2 --c11 0.0 --b11 0.25 --b21 0.25 --b32 0.9375 --c33 0.0 --c34 1.0 -g kuhn.limit.3p.game -r 237363252
|
@@ -1,3 +1,3 @@
|
|
1
1
|
#!/bin/bash
|
2
2
|
THIS_DIR=$( cd "$( dirname "$0" )" && pwd )
|
3
|
-
cd $THIS_DIR && ./kuhn_3p_equilibrium_player/kuhn_3p_equilibrium_player -n $1 -p $2 --c11 0.5 --b11 0.25 --b21 0.0 --b23 0.125 --b32 0.75 --c33 0.0 --c34 0.75 -g kuhn.limit.3p.game
|
3
|
+
cd $THIS_DIR && ./kuhn_3p_equilibrium_player/kuhn_3p_equilibrium_player -n $1 -p $2 --c11 0.5 --b11 0.25 --b21 0.0 --b23 0.125 --b32 0.75 --c33 0.0 --c34 0.75 -g kuhn.limit.3p.game -r 237363252
|
@@ -1,3 +1,3 @@
|
|
1
1
|
#!/bin/bash
|
2
2
|
THIS_DIR=$( cd "$( dirname "$0" )" && pwd )
|
3
|
-
cd $THIS_DIR && ./kuhn_3p_equilibrium_player/kuhn_3p_equilibrium_player -n $1 -p $2 --c11 0.33 --b11 0.166667 --b32 0.791667 --c33 0.0 --c34 0.75 -g kuhn.limit.3p.game
|
3
|
+
cd $THIS_DIR && ./kuhn_3p_equilibrium_player/kuhn_3p_equilibrium_player -n $1 -p $2 --c11 0.33 --b11 0.166667 --b32 0.791667 --c33 0.0 --c34 0.75 -g kuhn.limit.3p.game -r 237363252
|
@@ -1,35 +1,35 @@
|
|
1
1
|
Kuhn 3-Player Equilibrium Player
|
2
2
|
=================================
|
3
3
|
`kuhn_3p_equilibrium_player` is an ACPC compatible player that connects to the
|
4
|
-
ACPC dealer and plays 3-player Kuhn poker with an equilibrium component
|
5
|
-
strategy specified by its arguments from one of those specified by
|
6
|
-
[*A Parameterized Family of Equilibrium Profiles for Three-Player Kuhn
|
7
|
-
Poker*](http://poker.cs.ualberta.ca/publications/2013-techreport-nl-size.pdf),
|
8
|
-
written by Duane Szafron, Richard Gibson, and Nathan Sturtevant, found in
|
9
|
-
*Proceedings of the Twelfth International Conference on Autonomous Agents and
|
4
|
+
ACPC dealer and plays 3-player Kuhn poker with an equilibrium component
|
5
|
+
strategy specified by its arguments from one of those specified by
|
6
|
+
[*A Parameterized Family of Equilibrium Profiles for Three-Player Kuhn
|
7
|
+
Poker*](http://poker.cs.ualberta.ca/publications/2013-techreport-nl-size.pdf),
|
8
|
+
written by Duane Szafron, Richard Gibson, and Nathan Sturtevant, found in
|
9
|
+
*Proceedings of the Twelfth International Conference on Autonomous Agents and
|
10
10
|
Multiagent Systems (AAMAS-13)* in May 2013.
|
11
|
-
|
11
|
+
|
12
12
|
Equilibrium sub-families
|
13
13
|
--------------------------
|
14
|
-
There are three sub-families of equilibria identified by Szafron, Gibson, and
|
14
|
+
There are three sub-families of equilibria identified by Szafron, Gibson, and
|
15
15
|
Sturtevant, each defined by a different value of parameter `c11`. Depending on
|
16
16
|
the sub-family, different parameters must necessarily be provided, except for
|
17
17
|
`c11`, `b11`, `b32`, `c33`, and `c34`, which are always necessary. Please
|
18
|
-
see
|
18
|
+
see
|
19
19
|
[the paper](http://poker.cs.ualberta.ca/publications/2013-techreport-nl-size.pdf)
|
20
|
-
for the domain of each paramter.
|
20
|
+
for the domain of each paramter.
|
21
21
|
|
22
22
|
- `c11 = 0.0` sub-family: `b21` must also be provided.
|
23
23
|
- `c11 = 1/2.0` sub-family: `b21` and `b23` must also be provided.
|
24
|
-
- `0.0 < c11 < 1/2.0` sub-family: No futher parameters are necessary.
|
24
|
+
- `0.0 < c11 < 1/2.0` sub-family: No futher parameters are necessary.
|
25
25
|
|
26
26
|
License
|
27
27
|
-------
|
28
28
|
MIT license (see `LICENCE`).
|
29
29
|
|
30
|
-
|
30
|
+
Acknowledgments
|
31
31
|
----------------
|
32
|
-
This project includes software developed for
|
33
|
-
the CException Project, by Mark VanderVoord and other
|
32
|
+
This project includes software developed for
|
33
|
+
the CException Project, by Mark VanderVoord and other
|
34
34
|
contributors, as well as the Unity Project, by Mike Karlesky,
|
35
35
|
Mark VanderVoord, and Greg Williams and other contributors.
|
@@ -19,17 +19,17 @@ DealerConnection new_dealer_connection()
|
|
19
19
|
return this;
|
20
20
|
}
|
21
21
|
|
22
|
-
void connect_to_dealer(DealerConnection*
|
22
|
+
void connect_to_dealer(DealerConnection* thisPtr)
|
23
23
|
{
|
24
|
-
assert(
|
24
|
+
assert(thisPtr);
|
25
25
|
|
26
|
-
int sock = connectTo(
|
26
|
+
int sock = connectTo(thisPtr->host, thisPtr->port);
|
27
27
|
if( sock < 0 ) {
|
28
28
|
exit( EXIT_FAILURE );
|
29
29
|
}
|
30
|
-
|
31
|
-
|
32
|
-
if(!(
|
30
|
+
thisPtr->toServer = fdopen( sock, "w" );
|
31
|
+
thisPtr->fromServer = fdopen( sock, "r" );
|
32
|
+
if(!(thisPtr->toServer && thisPtr->fromServer)) {
|
33
33
|
fprintf( stderr, "ERROR: could not get socket streams\n" );
|
34
34
|
exit( EXIT_FAILURE );
|
35
35
|
}
|
@@ -37,7 +37,7 @@ void connect_to_dealer(DealerConnection* this)
|
|
37
37
|
/* send version string to dealer */
|
38
38
|
if(
|
39
39
|
fprintf(
|
40
|
-
|
40
|
+
thisPtr->toServer,
|
41
41
|
"VERSION:%"PRIu32".%"PRIu32".%"PRIu32"\n",
|
42
42
|
VERSION_MAJOR, VERSION_MINOR, VERSION_REVISION
|
43
43
|
) != 14
|
@@ -45,5 +45,5 @@ void connect_to_dealer(DealerConnection* this)
|
|
45
45
|
fprintf( stderr, "ERROR: could not get send version to server\n" );
|
46
46
|
exit(EXIT_FAILURE);
|
47
47
|
}
|
48
|
-
fflush(
|
48
|
+
fflush(thisPtr->toServer);
|
49
49
|
}
|
@@ -9,7 +9,7 @@ Copyright (C) 2013 by the Computer Poker Research Group, University of Alberta
|
|
9
9
|
#include <math.h>
|
10
10
|
#include <assert.h>
|
11
11
|
|
12
|
-
#include
|
12
|
+
#include <CException.h>
|
13
13
|
void print_and_throw_error(const char const *message)
|
14
14
|
{
|
15
15
|
fprintf(stderr, "ERROR: %s", message);
|
@@ -211,7 +211,7 @@ static void check_params(Kuhn3pEquilibriumPlayer* kuhn_3p_e_player)
|
|
211
211
|
|
212
212
|
static void action_probs_p0(
|
213
213
|
uint8_t card_rank,
|
214
|
-
const State
|
214
|
+
const State* state,
|
215
215
|
double* probs
|
216
216
|
) {
|
217
217
|
assert(probs);
|
@@ -239,9 +239,9 @@ static void action_probs_p0(
|
|
239
239
|
}
|
240
240
|
|
241
241
|
static void action_probs_p1(
|
242
|
-
const double
|
242
|
+
const double* params,
|
243
243
|
uint8_t card_rank,
|
244
|
-
const State
|
244
|
+
const State* state,
|
245
245
|
double* probs
|
246
246
|
) {
|
247
247
|
assert(params);
|
@@ -309,9 +309,9 @@ static void action_probs_p1(
|
|
309
309
|
}
|
310
310
|
|
311
311
|
static void action_probs_p2(
|
312
|
-
const double
|
312
|
+
const double* params,
|
313
313
|
uint8_t card_rank,
|
314
|
-
const State
|
314
|
+
const State* state,
|
315
315
|
double* probs
|
316
316
|
)
|
317
317
|
{
|
@@ -386,8 +386,8 @@ static void action_probs_p2(
|
|
386
386
|
/* create any private space needed for future calls
|
387
387
|
game_def is a private copy allocated by the dealer for the player's use */
|
388
388
|
Kuhn3pEquilibriumPlayer new_kuhn_3p_equilibrium_player(
|
389
|
-
const Game
|
390
|
-
const double
|
389
|
+
const Game* game_def,
|
390
|
+
const double* params,
|
391
391
|
uint32_t seed
|
392
392
|
)
|
393
393
|
{
|
@@ -461,7 +461,7 @@ Action action(
|
|
461
461
|
This is an extra function, and does _NOT_ need to be implemented
|
462
462
|
to be considered a valid player.h interface. */
|
463
463
|
void action_probs(
|
464
|
-
const Kuhn3pEquilibriumPlayer
|
464
|
+
const Kuhn3pEquilibriumPlayer* player,
|
465
465
|
MatchState view,
|
466
466
|
double* probs
|
467
467
|
)
|
@@ -5,9 +5,9 @@ Copyright (C) 2013 by the Computer Poker Research Group, University of Alberta
|
|
5
5
|
#ifndef __KUHN_3P_EQUILIBRIUM_PLAYER_H__
|
6
6
|
#define __KUHN_3P_EQUILIBRIUM_PLAYER_H__
|
7
7
|
|
8
|
-
#include
|
9
|
-
#include
|
10
|
-
#include
|
8
|
+
#include <game.h>
|
9
|
+
#include <rng.h>
|
10
|
+
#include <net.h>
|
11
11
|
|
12
12
|
// Types ----------------
|
13
13
|
typedef enum {
|
@@ -33,7 +33,7 @@ typedef struct {
|
|
33
33
|
|
34
34
|
typedef enum{JACK_RANK = 9, QUEEN_RANK, KING_RANK, ACE_RANK} CardRank;
|
35
35
|
|
36
|
-
typedef enum{A_POSITION = 0, B_POSITION, C_POSITION} PlayerPosition;
|
36
|
+
typedef enum{A_POSITION = 0, B_POSITION, C_POSITION, NUM_PLAYERS} PlayerPosition;
|
37
37
|
|
38
38
|
// Constants -------------
|
39
39
|
#define KUHN_SUIT 3
|
@@ -41,6 +41,7 @@ typedef enum{A_POSITION = 0, B_POSITION, C_POSITION} PlayerPosition;
|
|
41
41
|
#define QUEEN makeCard(QUEEN_RANK, KUHN_SUIT)
|
42
42
|
#define KING makeCard(KING_RANK, KUHN_SUIT)
|
43
43
|
#define ACE makeCard(ACE_RANK, KUHN_SUIT)
|
44
|
+
#define NUM_CARDS 4
|
44
45
|
|
45
46
|
#define KAPPA (1/24.0)
|
46
47
|
|
@@ -90,8 +91,8 @@ static const double C4[] = {1.0, 1.0, 1.0, 1.0};
|
|
90
91
|
// Functions -----------------
|
91
92
|
double beta(const Kuhn3pEquilibriumPlayer* kuhn_3p_e_player);
|
92
93
|
Kuhn3pEquilibriumPlayer new_kuhn_3p_equilibrium_player(
|
93
|
-
const Game
|
94
|
-
const double
|
94
|
+
const Game* game_def,
|
95
|
+
const double* params,
|
95
96
|
uint32_t seed
|
96
97
|
);
|
97
98
|
Action action(
|
@@ -99,7 +100,7 @@ Action action(
|
|
99
100
|
MatchState view
|
100
101
|
);
|
101
102
|
void action_probs(
|
102
|
-
const Kuhn3pEquilibriumPlayer
|
103
|
+
const Kuhn3pEquilibriumPlayer* player,
|
103
104
|
MatchState view,
|
104
105
|
double* probs
|
105
106
|
);
|
data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cexception/docs/license.txt
CHANGED
@@ -1,30 +1,30 @@
|
|
1
|
-
Copyright (c) 2007 Mark VanderVoord
|
2
|
-
|
3
|
-
Permission is hereby granted, free of charge, to any person
|
4
|
-
obtaining a copy of this software and associated documentation
|
5
|
-
files (the "Software"), to deal in the Software without
|
6
|
-
restriction, including without limitation the rights to use,
|
7
|
-
copy, modify, merge, publish, distribute, sublicense, and/or sell
|
8
|
-
copies of the Software, and to permit persons to whom the
|
9
|
-
Software is furnished to do so, subject to the following
|
10
|
-
conditions:
|
11
|
-
|
12
|
-
The above copyright notice and this permission notice shall be
|
13
|
-
included in all copies or substantial portions of the Software.
|
14
|
-
|
15
|
-
The end-user documentation included with the redistribution, if
|
16
|
-
any, must include the following acknowledgment: "This product
|
17
|
-
includes software developed for the CEXCeption Project, by Mark
|
18
|
-
VanderVoord and other contributors", in the same place and form
|
19
|
-
as other third-party acknowledgments. Alternately, this
|
20
|
-
acknowledgment may appear in the software itself, in the same
|
21
|
-
form and location as other such third-party acknowledgments.
|
22
|
-
|
23
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
24
|
-
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
25
|
-
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
26
|
-
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
27
|
-
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
28
|
-
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
29
|
-
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
1
|
+
Copyright (c) 2007 Mark VanderVoord
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person
|
4
|
+
obtaining a copy of this software and associated documentation
|
5
|
+
files (the "Software"), to deal in the Software without
|
6
|
+
restriction, including without limitation the rights to use,
|
7
|
+
copy, modify, merge, publish, distribute, sublicense, and/or sell
|
8
|
+
copies of the Software, and to permit persons to whom the
|
9
|
+
Software is furnished to do so, subject to the following
|
10
|
+
conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be
|
13
|
+
included in all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
The end-user documentation included with the redistribution, if
|
16
|
+
any, must include the following acknowledgment: "This product
|
17
|
+
includes software developed for the CEXCeption Project, by Mark
|
18
|
+
VanderVoord and other contributors", in the same place and form
|
19
|
+
as other third-party acknowledgments. Alternately, this
|
20
|
+
acknowledgment may appear in the software itself, in the same
|
21
|
+
form and location as other such third-party acknowledgments.
|
22
|
+
|
23
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
24
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
25
|
+
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
26
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
27
|
+
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
28
|
+
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
29
|
+
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
30
30
|
OTHER DEALINGS IN THE SOFTWARE.
|
data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cexception/docs/readme.txt
CHANGED
@@ -1,242 +1,242 @@
|
|
1
|
-
====================================================================
|
2
|
-
CException
|
3
|
-
====================================================================
|
4
|
-
|
5
|
-
CException is a basic exception framework for C, suitable for use in
|
6
|
-
embedded applications. It provides an exception framework similar in
|
7
|
-
use to C++, but with much less overhead.
|
8
|
-
|
9
|
-
CException uses C standard library functions setjmp and longjmp to
|
10
|
-
operate. As long as the target system has these two functions defined,
|
11
|
-
this library should be useable with very little configuration. It
|
12
|
-
even supports environments where multiple program flows are in use,
|
13
|
-
such as real-time operating systems.
|
14
|
-
|
15
|
-
There are about a gabillion exception frameworks using a similar
|
16
|
-
setjmp/longjmp method out there... and there will probably be more
|
17
|
-
in the future. Unfortunately, when we started our last embedded
|
18
|
-
project, all those that existed either (a) did not support multiple
|
19
|
-
tasks (therefore multiple stacks) or (b) were way more complex than
|
20
|
-
we really wanted. CException was born.
|
21
|
-
|
22
|
-
Why use CException?
|
23
|
-
|
24
|
-
0. It's ANSI C, and it beats passing error codes around.
|
25
|
-
|
26
|
-
1. You want something simple... CException throws a single id. You can
|
27
|
-
define those ID's to be whatever you like. You might even choose which
|
28
|
-
type that number is for your project. But that's as far as it goes.
|
29
|
-
We weren't interested in passing objects or structs or strings...
|
30
|
-
just simple error codes.
|
31
|
-
|
32
|
-
2. Performance... CException can be configured for single tasking or
|
33
|
-
multitasking. In single tasking, there is very little overhead past
|
34
|
-
the setjmp/longjmp calls (which are already fast). In multitasking,
|
35
|
-
your only additional overhead is the time it takes you to determine
|
36
|
-
a unique task id 0 - num_tasks.
|
37
|
-
|
38
|
-
For the latest version, go to http://cexception.sourceforge.net
|
39
|
-
|
40
|
-
--------------------------------------------------------------------
|
41
|
-
CONTENTS OF THIS DOCUMENT
|
42
|
-
--------------------------------------------------------------------
|
43
|
-
|
44
|
-
Usage
|
45
|
-
Limitations
|
46
|
-
API
|
47
|
-
Configuration
|
48
|
-
Testing
|
49
|
-
License
|
50
|
-
|
51
|
-
--------------------------------------------------------------------
|
52
|
-
Usage
|
53
|
-
--------------------------------------------------------------------
|
54
|
-
|
55
|
-
Code that is to be protected are wrapped in Try { } Catch { } blocks.
|
56
|
-
The code directly following the Try call is "protected", meaning that
|
57
|
-
if any Throws occur, program control is directly transferred to the
|
58
|
-
start of the Catch block.
|
59
|
-
|
60
|
-
A numerical exception ID is included with Throw, and is made accessible
|
61
|
-
from the Catch block.
|
62
|
-
|
63
|
-
Throws can occur from within function calls (nested as deeply as you
|
64
|
-
like) or directly from within the function itself.
|
65
|
-
|
66
|
-
--------------------------------------------------------------------
|
67
|
-
Limitations
|
68
|
-
--------------------------------------------------------------------
|
69
|
-
|
70
|
-
This library was made to be as fast as possible, and provide basic
|
71
|
-
exception handling. It is not a full-blown exception library. Because
|
72
|
-
of this, there are a few limitations that should be observed in order
|
73
|
-
to successfully utilize this library:
|
74
|
-
|
75
|
-
1. Do not directly "return" from within a Try block, nor "goto"
|
76
|
-
into or out of a Try block.
|
77
|
-
|
78
|
-
Why?
|
79
|
-
|
80
|
-
The "Try" macro allocates some local memory and alters a global
|
81
|
-
pointer. These are cleaned up at the top of the "Catch" macro.
|
82
|
-
Gotos and returns would bypass some of these steps, resulting in
|
83
|
-
memory leaks or unpredictable behavior.
|
84
|
-
|
85
|
-
2. If (a) you change local (stack) variables within your Try block,
|
86
|
-
AND (b) wish to make use of the updated values after an exception
|
87
|
-
is thrown, those variables should be made volatile. Note that this
|
88
|
-
is ONLY for locals and ONLY when you need access to them after a
|
89
|
-
throw.
|
90
|
-
|
91
|
-
Why?
|
92
|
-
|
93
|
-
Compilers optimize. There is no way to guarantee that the actual
|
94
|
-
memory location was updated and not just a register unless the
|
95
|
-
variable is marked volatile.
|
96
|
-
|
97
|
-
3. Memory which is malloc'd or new'd is not automatically released
|
98
|
-
when an error is thrown. This will sometimes be desirable, and
|
99
|
-
othertimes may not. It will be the responsibility of the Catch
|
100
|
-
block to perform this kind of cleanup.
|
101
|
-
|
102
|
-
Why?
|
103
|
-
|
104
|
-
There's just no easy way to track malloc'd memory, etc., without
|
105
|
-
replacing or wrapping malloc calls or something like that. This
|
106
|
-
is a light framework, so these options were not desirable.
|
107
|
-
|
108
|
-
--------------------------------------------------------------------
|
109
|
-
API
|
110
|
-
--------------------------------------------------------------------
|
111
|
-
|
112
|
-
Try
|
113
|
-
---
|
114
|
-
|
115
|
-
Try is a macro which starts a protected block. It MUST be followed by
|
116
|
-
a pair of braces or a single protected line (similar to an 'if'),
|
117
|
-
enclosing the data that is to be protected. It MUST be followed by a
|
118
|
-
Catch block (don't worry, you'll get compiler errors to let you know if
|
119
|
-
you mess any of that up).
|
120
|
-
|
121
|
-
Catch(e)
|
122
|
-
--------
|
123
|
-
|
124
|
-
Catch is a macro which ends the Try block and starts the error handling
|
125
|
-
block. The catch block is called if and only if an exception was thrown
|
126
|
-
while within the Try block. This error was thrown by a Throw call
|
127
|
-
somewhere within Try (or within a function called within Try, or a function
|
128
|
-
called by a function called within Try, etc).
|
129
|
-
|
130
|
-
The single parameter 'e' is filled with the error code which was thrown.
|
131
|
-
This can be used for reporting, conditional cleanup, etc. (or you can just
|
132
|
-
ignore it if you really want... people ignore return codes all the time,
|
133
|
-
right?). 'e' should be of type EXCEPTION_T;
|
134
|
-
|
135
|
-
Throw(e)
|
136
|
-
--------
|
137
|
-
|
138
|
-
The method of throwing an error. Throws should only occur from within a
|
139
|
-
protected (Try...Catch) block, though it may easily be nested many function
|
140
|
-
calls deep without an impact on performance or functionality. Throw takes
|
141
|
-
a single argument, which is an exception id which will be passed to Catch
|
142
|
-
as the reason for the error.
|
143
|
-
|
144
|
-
If you wish to Rethrow an error, this can be done by calling Throw(e) with
|
145
|
-
the error code you just caught. It IS valid to throw from a catch block.
|
146
|
-
|
147
|
-
--------------------------------------------------------------------
|
148
|
-
CONFIGURATION
|
149
|
-
--------------------------------------------------------------------
|
150
|
-
|
151
|
-
CException is a mostly portable library. It has one universal
|
152
|
-
dependency, and some macros which are required if working in a
|
153
|
-
multi-tasking environment.
|
154
|
-
|
155
|
-
1. The standard C library setjmp must be available. Since this is part
|
156
|
-
of the standard library, chances are good that you'll be fine.
|
157
|
-
|
158
|
-
2. If working in a multitasking environment, methods for obtaining an
|
159
|
-
index into an array of frames and to get the overall number of
|
160
|
-
id's are required. If the OS supports a method to retrieve Task
|
161
|
-
ID's, and those Tasks are number 0, 1, 2... you are in an ideal
|
162
|
-
situation. Otherwise, a more creative mapping function may be
|
163
|
-
required. Note that this function is likely to be called twice
|
164
|
-
for each protected block and once during a throw. This is the
|
165
|
-
only overhead in the system.
|
166
|
-
|
167
|
-
Exception.h
|
168
|
-
-----------------
|
169
|
-
By convention, most projects include Exception.h which defines any
|
170
|
-
further requirements, then calls CException.h to do the gruntwork. All
|
171
|
-
of these are optional. You could directly include CException.h if
|
172
|
-
you wanted and just use the defaults provided.
|
173
|
-
|
174
|
-
EXCEPTION_T - Set this to the type you want your exception id's
|
175
|
-
to be. Defaults to 'unsigned int'.
|
176
|
-
|
177
|
-
EXCEPTION_NONE - Set this to a number which will never be an
|
178
|
-
exception id in your system. Defaults to 0x5a5a5a5a.
|
179
|
-
|
180
|
-
EXCEPTION_GET_ID - If in a multi-tasking environment, this should be
|
181
|
-
set to be a call to the function described in #2 above.
|
182
|
-
Defaults to just return 0 all the time (good for
|
183
|
-
single tasking environments)
|
184
|
-
|
185
|
-
EXCEPTION_NUM_ID - If in a multi-tasking environment, this should be set
|
186
|
-
to the number of ID's required (usually the number of
|
187
|
-
tasks in the system). Defaults to 1 (for single
|
188
|
-
tasking environments).
|
189
|
-
|
190
|
-
CEXCEPTION_NO_CATCH_HANDLER(id) - This macro can be optionally specified.
|
191
|
-
It allows you to specify code to be called when a Throw
|
192
|
-
is made outside of Try...Catch protection. Consider
|
193
|
-
this the emergency fallback plan for when something has
|
194
|
-
gone terribly wrong.
|
195
|
-
|
196
|
-
You may also want to include any header files which will commonly be
|
197
|
-
needed by the rest of your application where it uses exception handling
|
198
|
-
here. For example, OS header files or exception codes would be useful.
|
199
|
-
|
200
|
-
--------------------------------------------------------------------
|
201
|
-
TESTING
|
202
|
-
--------------------------------------------------------------------
|
203
|
-
|
204
|
-
If you want to validate that CException works with your tools or that
|
205
|
-
it works with your custom configuration, you may want to run the test
|
206
|
-
suite.
|
207
|
-
|
208
|
-
The test suite included makes use of the Unity Test Framework. It will
|
209
|
-
require a native C compiler. The example makefile uses MinGW's gcc.
|
210
|
-
Modify the makefile to include the proper paths to tools, then run 'make'
|
211
|
-
to compile and run the test application.
|
212
|
-
|
213
|
-
C_COMPILER - The C compiler to use to perform the tests
|
214
|
-
C_LIBS - The path to the C libraries (including setjmp)
|
215
|
-
UNITY_DIR - The path to the Unity framework (required to run tests)
|
216
|
-
(get it at http://unity.sourceforge.net)
|
217
|
-
|
218
|
-
--------------------------------------------------------------------
|
219
|
-
LICENSE
|
220
|
-
--------------------------------------------------------------------
|
221
|
-
|
222
|
-
This software is licensed under the MIT License
|
223
|
-
|
224
|
-
Copyright (c) 2007-2012 Mark VanderVoord
|
225
|
-
|
226
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
227
|
-
of this software and associated documentation files (the "Software"), to deal
|
228
|
-
in the Software without restriction, including without limitation the rights
|
229
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
230
|
-
copies of the Software, and to permit persons to whom the Software is
|
231
|
-
furnished to do so, subject to the following conditions:
|
232
|
-
|
233
|
-
The above copyright notice and this permission notice shall be included in
|
234
|
-
all copies or substantial portions of the Software.
|
235
|
-
|
236
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
237
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
238
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
239
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
240
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
241
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
242
|
-
THE SOFTWARE.
|
1
|
+
====================================================================
|
2
|
+
CException
|
3
|
+
====================================================================
|
4
|
+
|
5
|
+
CException is a basic exception framework for C, suitable for use in
|
6
|
+
embedded applications. It provides an exception framework similar in
|
7
|
+
use to C++, but with much less overhead.
|
8
|
+
|
9
|
+
CException uses C standard library functions setjmp and longjmp to
|
10
|
+
operate. As long as the target system has these two functions defined,
|
11
|
+
this library should be useable with very little configuration. It
|
12
|
+
even supports environments where multiple program flows are in use,
|
13
|
+
such as real-time operating systems.
|
14
|
+
|
15
|
+
There are about a gabillion exception frameworks using a similar
|
16
|
+
setjmp/longjmp method out there... and there will probably be more
|
17
|
+
in the future. Unfortunately, when we started our last embedded
|
18
|
+
project, all those that existed either (a) did not support multiple
|
19
|
+
tasks (therefore multiple stacks) or (b) were way more complex than
|
20
|
+
we really wanted. CException was born.
|
21
|
+
|
22
|
+
Why use CException?
|
23
|
+
|
24
|
+
0. It's ANSI C, and it beats passing error codes around.
|
25
|
+
|
26
|
+
1. You want something simple... CException throws a single id. You can
|
27
|
+
define those ID's to be whatever you like. You might even choose which
|
28
|
+
type that number is for your project. But that's as far as it goes.
|
29
|
+
We weren't interested in passing objects or structs or strings...
|
30
|
+
just simple error codes.
|
31
|
+
|
32
|
+
2. Performance... CException can be configured for single tasking or
|
33
|
+
multitasking. In single tasking, there is very little overhead past
|
34
|
+
the setjmp/longjmp calls (which are already fast). In multitasking,
|
35
|
+
your only additional overhead is the time it takes you to determine
|
36
|
+
a unique task id 0 - num_tasks.
|
37
|
+
|
38
|
+
For the latest version, go to http://cexception.sourceforge.net
|
39
|
+
|
40
|
+
--------------------------------------------------------------------
|
41
|
+
CONTENTS OF THIS DOCUMENT
|
42
|
+
--------------------------------------------------------------------
|
43
|
+
|
44
|
+
Usage
|
45
|
+
Limitations
|
46
|
+
API
|
47
|
+
Configuration
|
48
|
+
Testing
|
49
|
+
License
|
50
|
+
|
51
|
+
--------------------------------------------------------------------
|
52
|
+
Usage
|
53
|
+
--------------------------------------------------------------------
|
54
|
+
|
55
|
+
Code that is to be protected are wrapped in Try { } Catch { } blocks.
|
56
|
+
The code directly following the Try call is "protected", meaning that
|
57
|
+
if any Throws occur, program control is directly transferred to the
|
58
|
+
start of the Catch block.
|
59
|
+
|
60
|
+
A numerical exception ID is included with Throw, and is made accessible
|
61
|
+
from the Catch block.
|
62
|
+
|
63
|
+
Throws can occur from within function calls (nested as deeply as you
|
64
|
+
like) or directly from within the function itself.
|
65
|
+
|
66
|
+
--------------------------------------------------------------------
|
67
|
+
Limitations
|
68
|
+
--------------------------------------------------------------------
|
69
|
+
|
70
|
+
This library was made to be as fast as possible, and provide basic
|
71
|
+
exception handling. It is not a full-blown exception library. Because
|
72
|
+
of this, there are a few limitations that should be observed in order
|
73
|
+
to successfully utilize this library:
|
74
|
+
|
75
|
+
1. Do not directly "return" from within a Try block, nor "goto"
|
76
|
+
into or out of a Try block.
|
77
|
+
|
78
|
+
Why?
|
79
|
+
|
80
|
+
The "Try" macro allocates some local memory and alters a global
|
81
|
+
pointer. These are cleaned up at the top of the "Catch" macro.
|
82
|
+
Gotos and returns would bypass some of these steps, resulting in
|
83
|
+
memory leaks or unpredictable behavior.
|
84
|
+
|
85
|
+
2. If (a) you change local (stack) variables within your Try block,
|
86
|
+
AND (b) wish to make use of the updated values after an exception
|
87
|
+
is thrown, those variables should be made volatile. Note that this
|
88
|
+
is ONLY for locals and ONLY when you need access to them after a
|
89
|
+
throw.
|
90
|
+
|
91
|
+
Why?
|
92
|
+
|
93
|
+
Compilers optimize. There is no way to guarantee that the actual
|
94
|
+
memory location was updated and not just a register unless the
|
95
|
+
variable is marked volatile.
|
96
|
+
|
97
|
+
3. Memory which is malloc'd or new'd is not automatically released
|
98
|
+
when an error is thrown. This will sometimes be desirable, and
|
99
|
+
othertimes may not. It will be the responsibility of the Catch
|
100
|
+
block to perform this kind of cleanup.
|
101
|
+
|
102
|
+
Why?
|
103
|
+
|
104
|
+
There's just no easy way to track malloc'd memory, etc., without
|
105
|
+
replacing or wrapping malloc calls or something like that. This
|
106
|
+
is a light framework, so these options were not desirable.
|
107
|
+
|
108
|
+
--------------------------------------------------------------------
|
109
|
+
API
|
110
|
+
--------------------------------------------------------------------
|
111
|
+
|
112
|
+
Try
|
113
|
+
---
|
114
|
+
|
115
|
+
Try is a macro which starts a protected block. It MUST be followed by
|
116
|
+
a pair of braces or a single protected line (similar to an 'if'),
|
117
|
+
enclosing the data that is to be protected. It MUST be followed by a
|
118
|
+
Catch block (don't worry, you'll get compiler errors to let you know if
|
119
|
+
you mess any of that up).
|
120
|
+
|
121
|
+
Catch(e)
|
122
|
+
--------
|
123
|
+
|
124
|
+
Catch is a macro which ends the Try block and starts the error handling
|
125
|
+
block. The catch block is called if and only if an exception was thrown
|
126
|
+
while within the Try block. This error was thrown by a Throw call
|
127
|
+
somewhere within Try (or within a function called within Try, or a function
|
128
|
+
called by a function called within Try, etc).
|
129
|
+
|
130
|
+
The single parameter 'e' is filled with the error code which was thrown.
|
131
|
+
This can be used for reporting, conditional cleanup, etc. (or you can just
|
132
|
+
ignore it if you really want... people ignore return codes all the time,
|
133
|
+
right?). 'e' should be of type EXCEPTION_T;
|
134
|
+
|
135
|
+
Throw(e)
|
136
|
+
--------
|
137
|
+
|
138
|
+
The method of throwing an error. Throws should only occur from within a
|
139
|
+
protected (Try...Catch) block, though it may easily be nested many function
|
140
|
+
calls deep without an impact on performance or functionality. Throw takes
|
141
|
+
a single argument, which is an exception id which will be passed to Catch
|
142
|
+
as the reason for the error.
|
143
|
+
|
144
|
+
If you wish to Rethrow an error, this can be done by calling Throw(e) with
|
145
|
+
the error code you just caught. It IS valid to throw from a catch block.
|
146
|
+
|
147
|
+
--------------------------------------------------------------------
|
148
|
+
CONFIGURATION
|
149
|
+
--------------------------------------------------------------------
|
150
|
+
|
151
|
+
CException is a mostly portable library. It has one universal
|
152
|
+
dependency, and some macros which are required if working in a
|
153
|
+
multi-tasking environment.
|
154
|
+
|
155
|
+
1. The standard C library setjmp must be available. Since this is part
|
156
|
+
of the standard library, chances are good that you'll be fine.
|
157
|
+
|
158
|
+
2. If working in a multitasking environment, methods for obtaining an
|
159
|
+
index into an array of frames and to get the overall number of
|
160
|
+
id's are required. If the OS supports a method to retrieve Task
|
161
|
+
ID's, and those Tasks are number 0, 1, 2... you are in an ideal
|
162
|
+
situation. Otherwise, a more creative mapping function may be
|
163
|
+
required. Note that this function is likely to be called twice
|
164
|
+
for each protected block and once during a throw. This is the
|
165
|
+
only overhead in the system.
|
166
|
+
|
167
|
+
Exception.h
|
168
|
+
-----------------
|
169
|
+
By convention, most projects include Exception.h which defines any
|
170
|
+
further requirements, then calls CException.h to do the gruntwork. All
|
171
|
+
of these are optional. You could directly include CException.h if
|
172
|
+
you wanted and just use the defaults provided.
|
173
|
+
|
174
|
+
EXCEPTION_T - Set this to the type you want your exception id's
|
175
|
+
to be. Defaults to 'unsigned int'.
|
176
|
+
|
177
|
+
EXCEPTION_NONE - Set this to a number which will never be an
|
178
|
+
exception id in your system. Defaults to 0x5a5a5a5a.
|
179
|
+
|
180
|
+
EXCEPTION_GET_ID - If in a multi-tasking environment, this should be
|
181
|
+
set to be a call to the function described in #2 above.
|
182
|
+
Defaults to just return 0 all the time (good for
|
183
|
+
single tasking environments)
|
184
|
+
|
185
|
+
EXCEPTION_NUM_ID - If in a multi-tasking environment, this should be set
|
186
|
+
to the number of ID's required (usually the number of
|
187
|
+
tasks in the system). Defaults to 1 (for single
|
188
|
+
tasking environments).
|
189
|
+
|
190
|
+
CEXCEPTION_NO_CATCH_HANDLER(id) - This macro can be optionally specified.
|
191
|
+
It allows you to specify code to be called when a Throw
|
192
|
+
is made outside of Try...Catch protection. Consider
|
193
|
+
this the emergency fallback plan for when something has
|
194
|
+
gone terribly wrong.
|
195
|
+
|
196
|
+
You may also want to include any header files which will commonly be
|
197
|
+
needed by the rest of your application where it uses exception handling
|
198
|
+
here. For example, OS header files or exception codes would be useful.
|
199
|
+
|
200
|
+
--------------------------------------------------------------------
|
201
|
+
TESTING
|
202
|
+
--------------------------------------------------------------------
|
203
|
+
|
204
|
+
If you want to validate that CException works with your tools or that
|
205
|
+
it works with your custom configuration, you may want to run the test
|
206
|
+
suite.
|
207
|
+
|
208
|
+
The test suite included makes use of the Unity Test Framework. It will
|
209
|
+
require a native C compiler. The example makefile uses MinGW's gcc.
|
210
|
+
Modify the makefile to include the proper paths to tools, then run 'make'
|
211
|
+
to compile and run the test application.
|
212
|
+
|
213
|
+
C_COMPILER - The C compiler to use to perform the tests
|
214
|
+
C_LIBS - The path to the C libraries (including setjmp)
|
215
|
+
UNITY_DIR - The path to the Unity framework (required to run tests)
|
216
|
+
(get it at http://unity.sourceforge.net)
|
217
|
+
|
218
|
+
--------------------------------------------------------------------
|
219
|
+
LICENSE
|
220
|
+
--------------------------------------------------------------------
|
221
|
+
|
222
|
+
This software is licensed under the MIT License
|
223
|
+
|
224
|
+
Copyright (c) 2007-2012 Mark VanderVoord
|
225
|
+
|
226
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
227
|
+
of this software and associated documentation files (the "Software"), to deal
|
228
|
+
in the Software without restriction, including without limitation the rights
|
229
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
230
|
+
copies of the Software, and to permit persons to whom the Software is
|
231
|
+
furnished to do so, subject to the following conditions:
|
232
|
+
|
233
|
+
The above copyright notice and this permission notice shall be included in
|
234
|
+
all copies or substantial portions of the Software.
|
235
|
+
|
236
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
237
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
238
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
239
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
240
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
241
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
242
|
+
THE SOFTWARE.
|