CMPSC
311,
Introduction to Systems Programming
The C Preprocessor
Reading
- CP:AMA
- Sec. 2.2, The General Form of a Simple Program, Directives
- Sec. 2.6, Defining Names for Constants
- Ch. 14, The Preprocessor
- Ch. 15, Writing Large Programs
- Sec. 15.2, Header Files (#include)
- Sec. 15.4, Building a Multiple-File Program (make)
- This chapter is important; we'll get to it all eventually.
- Sec. 27.5, The
<tgmath.h> Header (C99):
Type-Generic Math
- C:ARM, Ch. 3, The C Preprocessor; Sec. 2.2, Comments; Sec.
2.1.2, Whitespace and Line Termination; Sec. 2.3, Tokens
- APUE, Sec. 2.7, Feature Test Macros
References
- The C Standard, Sec. 6.10, Preprocessing directives
Compiling a C program takes several steps.
In general,
- syntactic analysis - is the program legal?
- code transformations - rewrite the program to a simpler form,
closer to machine instructions
- code generation - write actual machine instructions, but maybe
leave some parts unfinished
- linking - combine previously-compiled parts, resolve anything
that was unfinished
Specifically for C,
- For each
.c file specified on the compile
command line,
- Run the source code through the C preprocessor, which
performs textual substitutions.
- Run the output of the preprocessor through the compiler,
which checks the syntax and (maybe) generates an object file.
- Collect the object files, and run them through the linker,
which modifies memory addresses and (maybe) generates an
executable file.
The actual implementation of the compiler could be in two parts, or
in one part.
Filename conventions (for more, see the Sun and GCC
documentation)
- file.c C
source code; run the preprocessor first
- note -- file.C
(capital C) is treated as C++ source code
- file.i C
source code; don't run the preprocessor first
- file.h header
file,
"include file"; does not stand on its own
- the compiler may use a precompiled header
- file.s assembly
code -- note "lowercase s"
- Solaris, Linux - don't run the preprocessor first
- Mac OS X - run the preprocessor first
- file.S assembly
code; run the preprocessor first -- note "uppercase S"
- file.o object
code,
object file
- file.a library
of object files; old style
- file.so dynamic
library, shared object files; modern style
Compiler options, starting from file.c (for more, see the Sun and GCC
documentation)
- -E write
the output of the preprocessor to standard output, then stop
- -S write
the assembly code to file.s,
then stop
- -c write
the object code to file.o,
then stop; don't run the linker
Experiment
- main.c,
one include file, 3 lines of code
- main.i,
output of gcc -E
main.c > main.i on Mac OS X, 362 lines
- main.i,
same, on Linux, 850 lines
- main.i,
same, on Solaris, 258 lines
- main.i,
output of cc -E
main.c > main.i on Solaris, 622 lines
Some initial vocabulary
- whitespace
- the printable blank character (space,
' ')
- the control characters horizontal tab (
'\t'),
vertical tab ('\v'), form feed ('\f'),
carriage
return ('\r'), newline ('\n').
- end-of-line (whether return, newline or return-newline)
- comments
- Whitespace is ignored but is used to separate adjacent
tokens as the compiler checks the syntax of the program.
- Comments are removed prior to running the preprocessor, and
replaced by a single space character.
- logical source line, source line continuation
- If the last character of a source line is
\
then the next line is joined with the current line.
- As if, the backslash and the immediately-following
end-of-line were not there.
- This is done before running the preprocessor.
- macro
- a piece of text that is replaced by the preprocessor with
another piece of text
- The macro needs to be defined before this action is
requested.
- macro replacement, macro expansion
- the action of replacing a macro with its proper substitute
- macro processor, macro language
- a tool or language which only performs text substitutions
- source file
- a file containing part of a C program, such as function
prototypes and definitions, etc.
- The file name would be expected to end in
.c
or .h for a C program.
- header
- The C Standard's term used instead of "header file" or
"include file" to allow for the possibility that there is no
actual file. If so, the compiler should act as if there
is.
- token
- characters are collected into tokens, which are treated as a
unit
- operators, separators, identifiers, keywords, constants
- tokens can be single characters (like the operator
+)
or multiple characters (like the operator +=)
- tokens can be separated by whitespace
Preprocessor commands, in the .h or .c files
Preprocessor command line
- first character of the line is
#
- whitespace may immediately precede or follow the leading
#,
on the same line
- within the line, use space and horizontal tab only
- the name of the preprocessor command follows
#
(and optional whitespace)
- arguments for the command (if any) follow the command name
- Be careful - in other settings, such as makefiles and shell
scripts, lines starting with
# are comments.
Preprocessor command lines are removed from the source file
(actually, replaced by blank lines), and may cause transformations
of the remaining part of the source file.
Preprocessor commands, preprocessor directives, preprocessing
directives
#include
#define
#undef
#if
#ifdef
#ifndef
#elif
#else
#endif
#line
#pragma
#error
# (the null
directive)
Preprocessor functions
Preprocessor operators
# (the
"stringization" operator)
## (the "token pasting"
operator)
_Pragma
There are no comment-like preprocessor features, except for the null
directive.
Exercise. What is the proper name of the # character?
- hash, hash sign, hash symbol, number sign, octothorpe, pig
pen, pound, pound sign, sharp, sharp sign, square, tic-tac-toe,
etc.
- See http://en.wikipedia.org/wiki/Number_sign
- Is a "hash key" one of your telephone buttons, or something
used in cryptography?
- Unicode code point U+0023 # is "number sign"
- Unicode code point U+FE5F ﹟ is "small number sign"
- Unicode code point U+FF03 # is "fullwidth number sign"
- Unicode code point U+2317 ⌗ is "viewdata square"
- Unicode code point U+266F ♯ is "music sharp sign"
- Microsoft's language C# is pronounced "see sharp".
- The C Standard refers to # as sharp sign and as hash, on the
same page.
#include <something.h>
#include "something.h"
- The first form searches in the directories indicated by
default and by the
-I option on the compiler
command line.
- The second form searches the current directory, then, if not
found, searches as for the first form.
- If found, the entire content of the file
something.h
is copied in, and the preprocessor continues after the #include
- which would be the first line from
something.h
- If the header comes with the system, use
<...>.
- If you wrote the header, use
"...".
- Common practice is to list the system headers first, but if
your headers are written correctly then the order doesn't
actually matter.
Examples
#include <stdio.h>
#include <stdio.h> /* for printf() */
#include "something.h"
Bad examples
#include
<something.c> /* almost certainly wrong */
#include "something.c" /* a symptom of bad program
design */
Examples to try
- [GCC] gcc
-print-search-dirs
- list the default directories
- [Sun] cc -H
file.c
- list the files that were #include'd
From GCC
-I dir
- Add the directory
dir to the list of directories
to be searched for header files. Directories named by -I
are searched before the standard system include
directories. If the directory dir is a
standard system include directory, the option is ignored to
ensure that the default search order for system directories and
the special treatment of system headers are not defeated.
From Solaris
-I dir
-I dir adds dir to the list of
directories that are searched for #include
files. -I values accumulate from left to
right.
- For include statements of the form
#include
<foo.h> the preprocessor searches for the
header file in the following order:
- The directories named with the
-I option, if
any.
- The compiler and system standard directories, usually
/usr/include
.
- For include statements of the form
#include
"foo.h" the compiler searches the directories in
the following order:
- The current directory (that is, the directory that contains
the file which contains the include statement itself).
- The directories named with
-I options, if any.
- The compiler and system standard directories, usually
/usr/include.
-I-
- (let's skip this part)
#define name
body
#define name(identifier-list)
body
- associate a name (the macro) with a sequence of tokens (the
macro's body or replacement-list)
- The macro body should be a sequence of well-formed tokens.
- "Well-formed" has a proper technical definition that we'll
skip; the compiler should complain if the body is not
well-formed.
#undef name
- forget (undefine) the definition of the macro
name
- It does not matter if
name
was previously defined or undefined.
- The scope of a #define'd
name
extends
to
the end of the file, or to the next matching #undef, whichever comes
first.
When the name of a defined macro is encountered by the preprocessor,
it is replaced with the body of the macro.
#define TABLESIZE 20
int table1[TABLESIZE];
int table2[TABLESIZE];
for (int i = 0; i < TABLESIZE; i++)
...
Simple
macro, object-like macro
#define name
body
- The body begins immediately after the name of the macro.
The body may be empty.
- Whitespace between
name
and body,
or between body
and end-of-line, is ignored.
- Sometimes called a symbolic
constant or a named
constant or a manifest
constant, but be careful not to confuse this with a
const-qualified
variable.
#define TABLESIZE 20
const int tablesize = 20;
- The name
tablesize is known to the
compiler. The name TABLESIZE is not, since
the preprocessor removes it.
- There is a set of pre-defined macros, see CP:AMA, Sec. 14.3,
or C:ARM Sec. 3.3.4.
__FILE__
__LINE__
__DATE__
__TIME__
__STDC__
__STD_VERSION__
- etc.
Parameterized macro, function-like macro
#define name(identifier-list)
body
- The opening parenthesis must directly follow the macro name.
- The identifier list can be empty.
- The body begins immediately after the closing
parenthesis. The body may be empty.
- similar rule about whitespace
- When used, there may be whitespace between the macro name and
the opening parenthesis.
- Syntactically, used as if it was a function call.
- The number of arguments supplied must match the number of
parameters in the definition.
- An argument can be empty; see CP:AMA, p. 331-2.
- There is a special case if the
identifier-list ends with ... (see
CP:AMA, p. 332-3, or C:ARM Sec. 3.3.10, or look for __VA_ARGS__ in the
index).
- See C:ARM p. 48 for additional notes on arguments with
parentheses or commas - practices to avoid.
A function-like macro can be used anywhere a function can be used.
- Except, you can have a pointer to a function but not a pointer
to a function-like macro.
Example, from <stdio.h> on Solaris (more of this
later)
#define getchar() getc(stdin)
#define putchar(x) putc((x), stdout)
Everyone's "favorite" example
#define max(a,b) ((a) > (b)
? (a) : (b))
- advantages
- inline code (no function call/return overhead)
- disadvantages
- multiple evaluations of the arguments, including side
effects
- if used very often, requires more instruction space compared
to a function
- no parameter/argument type-checking
- can't pass
max as an argument to another
function
Better? Is this even legal?
#define max(a,b) { int A =
(a), B = (b); A > B ? A : B }
The GNU compiler and Sun's compiler (most recent versions) have a C
language extension known as statement
expressions. The following is allowed:
#define max(a,b) ({ int A =
(a), B = (b); A > B ? A : B; })
[Note that an expression
statement is a different concept, which is standard.]
Better? Legal in C99 but not in C89.
Another example, although this really should be an inline function
(more about that later).
#define swap(x,y) { int t = x;
x = y; y = t; }
// properly used as swap(a,b)
// easily misused as swap(a,b);
// consider: if (a < b) swap(a,b); else b = a;
#define swap(x,y) \
do { int t = x; x = y; y = t; } while (0)
swap(a,b);
// now this is ok
Why is it not necessary to write
#define swap(x,y) \
do { int t = (x); (x) = (y); (y) = t; } while (0)
This style appears in the Linux kernel, but it's often confusing.
#define incr(v,low,high) \
for ((v) = (low); (v) <= (high); (v)++)
incr(j, 1, 20)
printf("%d\n", j);
These are probably mistakes.
#define TABLESIZE = 20
#define func (a) sqrt(a)
#define func(a) a*sqrt(a)
The # operator (the "stringization" operator) converts
a function-like macro argument to a string literal.
#define stringify(a) #a
stringify(word one) yields "word one"
Does stringify(word one, word two) yield "word
one, word two"?
Try to avoid things like stringify("x").
Here's another example:
#define SHOW(type) \
printf("%-32s %3zd %3zd\n", \
#type, sizeof(type), __alignof__(type));
The ## operator pastes two function-like macro tokens
together (token merging, token pasting).
- This requires considerable care, so we will postpone
discussion of examples until later.
- The example on CP:AMA, p. 325, vaguely resembles use of a
template in C++. See CP:AMA, Exercise 14.7, to see why it
isn't really the same thing; the solution is at http://knking.com/books/c2/answers/c14.html.
There are further rules about rescanning and further replacement of
macros.
The following is safe:
#define printf (void) printf
printf("hack\n");
but mind the spaces!
#if constant-expression-1
group-of-lines-1
#elif constant-expression-2
group-of-lines-2
#else
group-of-lines-3
#endif
Conditional compilation, conditional inclusion
- The source file lines (
group-of-lines-n)
are either in or out, depending on the value of the expressions
(control conditions).
- Only the first group whose control condition evaluates to true
(nonzero) is processed.
- The
#elif and #else commands are
optional if the associated group of lines is empty.
- The
constant-expression
is evaluated by the preprocessor after macro replacement, and
before analysis of the file as a C program.
- The form of the expression is restricted to integer constants
and the simple integer arithmetic, relational and logical
operators, of type
intmax_t or uintmax_t
as defined in <stdint.h>.
- also the
defined operator described next
- If the expression evaluates to nonzero, it is treated as true,
otherwise false.
- In this setting only, undefined macro names expand to 0, but
it would be better to use the
defined operator.
Example, from <stdio.h> on Solaris (indentation
added)
#if __cplusplus >= 199711L
namespace std {
inline int getchar() {
return getc(stdin); }
inline int putchar(int
_x) { return putc(_x, stdout); }
}
#else
#define
getchar() getc(stdin)
#define putchar(x)
putc((x), stdout)
#endif /* __cplusplus >= 199711L */
Example, from the C Standard, to illustrate macro replacement on the
#include line
#if VERSION == 1
#define
INCFILE "vers1.h"
#elif VERSION == 2
#define
INCFILE "vers2.h" // and so on
#else
#define
INCFILE "versN.h"
#endif
#include INCFILE
Better?
#if VERSION == 1
#include "vers1.h"
#elif VERSION == 2
#include "vers2.h" // and so on
#else
#include "versN.h"
#endif
defined identifier
defined(identifier)
#ifdef identifier
#ifndef identifier
- The
defined operator can be applied to a token,
and yields 1 or 0, according to the preprocessor's current set
of definitions.
#ifdef name is equivalent to
#if defined(name)
#ifndef name is equivalent to
#if ! defined(name)
Exercise. Evaluate defined(int)
.
#line
#pragma
#error
#
#line is used to communicate between the
preprocessor (or some other program-generating tool) and the
compiler. Don't use it yourself.
#pragma (as in pragmatic) is used to give advice
to the compiler. Don't use #pragma without
reading the documentation; the details usually depend on the
compiler implementation.
- C99 has three standard pragmas, which start as #pragma STDC ... ;
CP:AMA describes them in detail.
- C99 has a
_Pragma operator, which we'll ignore
here.
#error causes the preprocessor to fail and issue
a message, with the file name and line number.
# (alone) is the null directive; it has no
effect.
Better?
#if VERSION == 1
#include "vers1.h"
#elif VERSION == 2
#include "vers2.h" // and so on
#else
#error
You
blew
it!
VERSION not recognized.
#endif
Common techniques
To ignore large parts of a program,
#if 0
the compiler never sees this text
#endif
This is much safer than
/*
the compiler never sees this text
*/
The compilers allow object-like macros to be defined from the
command line with the -D option.
cc -o prog -Dname=body prog.c
For example,
cc -o prog -DTABLESIZE=100
prog.c
prog.c
#ifndef TABLESIZE
#define TABLESIZE 20
#endif
int table1[TABLESIZE];
int table2[TABLESIZE];
for (int i = 0; i < TABLESIZE; i++)
...
What would happen if we used this with the previous example?
cc -o prog -DTABLESIZE prog.c
A good rule is, Avoid multiple-definition errors.
Multiple declarations are allowed.
- What is the difference between a definition and a declaration?
- ok to repeat
- extern
declarations
- function prototypes
- not ok to repeat
- variable definitions in the same scope
- function definitions (functions are always defined at
top-level scope in C)
- Which of these is safe to repeat?
- Which of these is
safe to repeat?
- int add(int a, int b);
- int add(int a, int b) { return a+b; }
- static int add(int a, int b) { return a+b; }
- inline int add(int a, int b) { return a+b; }
- static inline int add(int a, int b) { return a+b; }
To avoid rereading an include file if it has been included already,
write something.h as
#ifndef SOMETHING_H
#define SOMETHING_H
...
#endif
To avoid redefinition of a macro, [simplified from <stddef.h>
on Solaris]
#ifndef NULL
#define NULL 0
#endif
To avoid redefinition of a type, use a macro, [simplified from
<stddef.h> on Solaris]
#if !defined(_SIZE_T)
#define _SIZE_T
typedef unsigned long size_t; /* size of
something in bytes */
#endif /* !_SIZE_T */
To select one of several cases,
#define TYPE_1 0
#define TYPE_2 1
#if TYPE_1
...
#endif
#if TYPE_2
...
#endif
How can you be certain that exactly one of these apply?
#if (TYPE_1 + TYPE_2)
!= 1
#error oops
#endif
Better?
cc -DTYPE=n ...
#if TYPE == 1
...
#elif TYPE == 2
...
#else
#error oops
#endif
Better?
use an int, or an
enumerated type, and if/else statements, or a switch
statement, make the selection at runtime
Example, from <assert.h> on Solaris, indentation
added
#ifdef NDEBUG
#define assert(EX) ((void)0)
#else
#if defined(__STDC__)
#if __STDC_VERSION__ - 0 >= 199901L
#define assert(EX) (void)((EX) || \
(__assert_c99(#EX, __FILE__, __LINE__, __func__), 0))
#else
#define assert(EX) (void)((EX) || \
(__assert(#EX, __FILE__, __LINE__), 0))
#endif /* __STDC_VERSION__ - 0 >= 199901L */
#else
#define assert(EX) (void)((EX) || \
(_assert("EX", __FILE__, __LINE__), 0))
#endif /* __STDC__ */
#endif /* NDEBUG */
We'll have more examples of the assert macro later.
__func__ is discussed in CP:AMA, p. 333; it is an
identifier, not a macro. The value of __func__
is essentially a pointer to a character string made from the name of
the function currently being compiled.
Example, the swap
function.
C uses pass-by-value only, but we can pass pointers.
static inline void
int_swap(int *a, int *b)
{ int t = *a; *a = *b; *b = t; }
The usage would be like
int m = 5, n = 6;
int_swap(&m, &n);
Example, the swap
macro/function as if we were using C++ pass-by-reference.
#define swap(a,b)
int_swap(&a, &b)
The usage would be like
int m = 5, n = 6;
swap(m, n);
Question. Will this confuse a C programmer who is not
expecting to find C++-like features in the program?
Question. If we use the wrong types, which line of code does
the compiler complain about?
1 static inline void int_swap(int
*a, int *b)
2 { int t = *a; *a =
*b; *b = t; }
3
4 #define
swap(a,b) int_swap(&a, &b)
5
6 int main(void)
7 {
8 int m = 5, n
= 6;
9 swap(m, n);
10
double x = 1, y = 2;
11
swap(x, y);
12
return 0;
13 }
% gcc -Wall -Wextra
x.c
x.c: In function 'main':
x.c:11: warning: passing argument 1 of 'int_swap'
from incompatible pointer type
x.c:11: warning: passing argument 2 of 'int_swap'
from incompatible pointer type
Exercise. Consider the
swap macro discussed
earlier.
#define swap(x,y) \
do { int t = x; x = y; y = t; } while (0)
Some people might prefer it to be written this way.
#define swap(x,y) \
do { int _t = x; x = y; y = _t; } while (0)
Why? Is the second version really better?
<tgmath.h>, Type-Generic Math in C99
The non-generic math functions in <math.h> look
like
double
sqrt (double x);
float sqrtf(float x);
long double sqrtl(long double x);
The non-generic math functions in <complex.h>
look like
double
complex csqrt (double complex x);
float complex
csqrtf(float complex x);
long double complex csqrtl(long double complex x);
The macros in <tgmath.h> allow you to write
something like
pick_a_type y, z;
y = something;
z = sqrt(y);
You can now change the declared type of y and z
without changing the rest of the code.
- There are also a few similar uses of the types
int,
long int and long long int in <math.h>,
but not in <complex.h>.
- The integer functions
abs(), labs()
and llabs() are defined in <stdlib.h>.
The
floating-point
versions
are
fabs(), fabsf(), fabsl(),
in <math.h>, and cabs(), cabsf(),
cabsl(), in <complex.h>.
Here is a simple implementation, that distinguishes float,
double and long double, but not the complex
versions:
#define sqrt(x) \
((sizeof(x) == sizeof(double)) ? sqrt(x) : \
(sizeof(x) == sizeof(float)) ? sqrtf(x) :
sqrtl(x))
Note that all the comparisons and choices are done by the
preprocessor, so there is no extra cost at runtime. Since the
preprocessor won't rescan the macro expansion of sqrt(y),
there is no recursive explosion.
In C11, generic type-matching moves from the preprocessor to the
language itself, and would look like
#define sqrt(x) _Generic((x), \
long double: sqrtl, \
default: sqrt, \
float: sqrtf \
) \
(x)
The generic selection of sqrt, sqrtf or sqrtl
is determined from the type of x, without having to resort
to the subterfuge of sizeof. The selection is made
by the compiler, not by the preprocessor, so there's more
flexibility in the available types.
An excerpt from GCC's <tgmath.h>, Type-Generic
Math in C99
- We left out the really ugly parts :-)
/*
* ISO C99 Standard: 7.22
Type-generic math
<tgmath.h>
*/
#ifndef _TGMATH_H
#define _TGMATH_H 1
/* Include the needed headers. */
#include <math.h>
#include <complex.h>
/* Since `complex' is currently not really implemented in most C
compilers
and if it is implemented, the implementations
differ. This makes it
quite difficult to write a generic implementation of
this header. We
do not try this for now and instead concentrate only
on GNU CC. Once
we have more information support for other compilers
might follow. */
# ifdef __NO_LONG_DOUBLE_MATH
# define __tgml(fct) fct
# else
# define __tgml(fct) fct ## l
# endif
/* This is ugly but unless gcc gets appropriate builtins we have
to do
something like this. Don't ask how it
works. */
/* 1 if 'type' is a floating type, 0 if 'type' is an integer type.
Allows for _Bool. Expands to an integer
constant expression. */
# define __floating_type(type) (((type) 0.25) && ((type)
0.25 - 1))
/* The tgmath real type for T, where E is 0 if T is an integer
type and
1 for a floating type. */
# define __tgmath_real_type_sub(T, E) \
__typeof__(*(0 ? (__typeof__ (0 ? (double *) 0 : (void *)
(E))) 0 \
: (__typeof__ (0 ? (T *) 0 : (void *) (!(E)))) 0))
/* The tgmath real type of EXPR. */
# define __tgmath_real_type(expr) \
__tgmath_real_type_sub(__typeof__(expr),
__floating_type(__typeof__(expr)))
/* We have two kinds of generic macros: to support functions which
are
only defined on real valued parameters and those
which are defined
for complex functions as well. */
# define __TGMATH_UNARY_REAL_ONLY(Val, Fct) \
(__extension__ ({ __tgmath_real_type
(Val)
__tgmres;
\
if (sizeof (Val) == sizeof
(double)
\
|| __builtin_classify_type (Val) != 8) \
__tgmres = Fct
(Val);
\
else if (sizeof (Val) == sizeof
(float)) \
__tgmres = Fct##f
(Val);
\
else
\
__tgmres = __tgml(Fct)
(Val);
\
__tgmres; }))
...
/* XXX This definition has to be changed as soon as the compiler
understands
the imaginary keyword. */
# define __TGMATH_UNARY_REAL_IMAG(Val, Fct, Cfct) \
(__extension__ ({ __tgmath_real_type
(Val)
__tgmres;
\
if (sizeof (__real__ (Val)) > sizeof
(double) \
&& __builtin_classify_type (__real__ (Val)) == 8) \
{
\
if (sizeof (__real__ (Val)) == sizeof
(Val)) \
__tgmres = __tgml(Fct)
(Val);
\
else
\
__tgmres = __tgml(Cfct)
(Val);
\
}
\
else if (sizeof (__real__ (Val)) == sizeof
(double) \
|| __builtin_classify_type (__real__ (Val)) \
!=
8)
\
{
\
if (sizeof (__real__ (Val)) == sizeof
(Val)) \
__tgmres = Fct
(Val);
\
else
\
__tgmres = Cfct
(Val);
\
}
\
else
\
{
\
if (sizeof (__real__ (Val)) == sizeof
(Val)) \
__tgmres = Fct##f
(Val);
\
else
\
__tgmres = Cfct##f
(Val);
\
}
\
__tgmres; }))
...
/* Compute base-2 logarithm of X. */
#define log2(Val) __TGMATH_UNARY_REAL_ONLY (Val, log2)
/* Return the square root of X. */
#define sqrt(Val) __TGMATH_UNARY_REAL_IMAG (Val, sqrt, csqrt)
...
Stack Overflow
Last revised, 24 Jan. 2013