[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 14/18] Fix initialization from incompatible pointer type
From: |
Marin Ramesa |
Subject: |
[PATCH 14/18] Fix initialization from incompatible pointer type |
Date: |
Fri, 6 Dec 2013 16:29:56 +0100 |
Fix initialization from incompatible pointer type in the initialization
of the field dev_name_list in i386/i386at/conf.c.
This patch has one questionable addition, that is the cast from io_req_t
to a pointer to uio struct in the function kdread().
* device/conf.h: Include sys/types.h.
Include mach/port.h.
Include mach/vm_prot.h.
Use forward structure declaration for io_req_t to avoid inclusion loop.
(dev_ops): Modify so that correct return and argument types are listed.
(nulldev_open, nulldev_close, nulldev_read, nulldev_getstat, nulldev_setstat,
nulldev_portdeath): Add prototypes.
(nomap): Modify argument and return types.
* device/dev_name.c (nulldev_open, nulldev_close, nulldev_read,
nulldev_getstat, nulldev_setstat, nulldev_portdeath): New functions.
(nomap): Modify argument and return types.
* device/ds_routines.c (*device->dev_ops->d_close): New parameter to the call.
* device/kmsg.c (kmsgclose): Modify argument and return types and drop the
D_SUCCESS return value.
* device/kmsg.h (kmsgclose): Modify argument and return types.
* i386/i386at/com.c (comopen, comclose, comread): Modify argument and return
types and drop the zero return value.
* i386/i386at/com.h (comopen, comclose, comread): Modify argument and return
types.
* i386/i386at/conf.c (dev_name_list): Modify field initialization.
* i386/i386at/kd.c (kdread, kdmmap): Modify argument and return types and cast
from io_req_t to a pointer to uio struct.
* i386/i386at/kd.h (kdread, kdmmap): Modify argument and return types.
* i386/i386at/kd_event.c (kbdopen, kbdclose): Modify argument and return types.
* i386/i386at/kd_event.h (kbdopen, kbdclose): Likewise.
* i386/i386at/kd_mouse.c (mouseopen, mouseclose): Modify argument types.
* i386/i386at/kd_mouse.h (mouseopen, mouseclose): Likewise.
* i386/i386at/lpr.c (lpropen, lprread): Likewise.
* i386/i386at/lpr.h (lpropen, lprread): Likewise.
* i386/i386at/mem.c (memmmap): Likewise.
* i386/i386at/mem.h (memmmap): Likewise.
* i386/i386at/model_dep.c (timemmap): Likewise.
* i386/i386at/model_dep.h (timemmap): Likewise.
* kern/mach_clock.c (timeopen, timeclose): Modify argument and return types and
drop the zero return value.
* kern/mach_clock.h: Include sys/types.h.
Use forward structure declaration for io_req_t to avoid inclusion loop.
(timeopen, timeclose): Modify argument and return types.
---
device/conf.h | 34 ++++++++++++++++++++++++----------
device/dev_name.c | 37 ++++++++++++++++++++++++++++++++++---
device/ds_routines.c | 2 +-
device/kmsg.c | 6 +++---
device/kmsg.h | 2 +-
i386/i386at/com.c | 12 ++++++------
i386/i386at/com.h | 6 +++---
i386/i386at/conf.c | 28 ++++++++++++++--------------
i386/i386at/kd.c | 8 ++++----
i386/i386at/kd.h | 4 ++--
i386/i386at/kd_event.c | 5 +++--
i386/i386at/kd_event.h | 4 ++--
i386/i386at/kd_mouse.c | 5 +++--
i386/i386at/kd_mouse.h | 4 ++--
i386/i386at/lpr.c | 4 ++--
i386/i386at/lpr.h | 4 ++--
i386/i386at/mem.c | 4 ++--
i386/i386at/mem.h | 2 +-
i386/i386at/model_dep.c | 4 ++--
i386/i386at/model_dep.h | 2 +-
kern/mach_clock.c | 6 +++---
kern/mach_clock.h | 7 +++++--
22 files changed, 120 insertions(+), 70 deletions(-)
diff --git a/device/conf.h b/device/conf.h
index e91e099..921e53b 100644
--- a/device/conf.h
+++ b/device/conf.h
@@ -32,22 +32,30 @@
#define _DEVICE_CONF_H_
#include <mach/machine/vm_types.h>
+#include <sys/types.h>
+#include <mach/port.h>
+#include <mach/vm_prot.h>
+
+struct io_req;
+typedef struct io_req *io_req_t;
+
+typedef int io_return_t;
/*
* Operations list for major device types.
*/
struct dev_ops {
- char * d_name; /* name for major device */
- int (*d_open)(); /* open device */
- int (*d_close)(); /* close device */
- int (*d_read)(); /* read */
+ char * d_name; /* name for
major device */
+ int (*d_open)(dev_t, int, io_req_t); /* open device
*/
+ void (*d_close)(int, int); /* close device
*/
+ int (*d_read)(dev_t, io_req_t); /* read */
int (*d_write)(); /* write */
- int (*d_getstat)(); /* get status/control */
- int (*d_setstat)(); /* set status/control */
- vm_offset_t (*d_mmap)(); /* map memory */
+ io_return_t (*d_getstat)(dev_t, int, int *, natural_t *); /* get
status/control */
+ io_return_t (*d_setstat)(dev_t, int, int *, natural_t); /* set
status/control */
+ int (*d_mmap)(dev_t, off_t, vm_prot_t); /* map
memory */
int (*d_async_in)();/* asynchronous input setup */
int (*d_reset)(); /* reset device */
- int (*d_port_death)();
+ int (*d_port_death)(dev_t, mach_port_t);
/* clean up reply ports */
int d_subdev; /* number of sub-devices per
unit */
@@ -58,9 +66,15 @@ typedef struct dev_ops *dev_ops_t;
/*
* Routines for null entries.
*/
-extern int nulldev(); /* no operation - OK */
+extern int nulldev(void);
/* no operation - OK */
+extern int nulldev_open(dev_t dev, int flag, io_req_t ior);
/* no operation - OK */
+extern void nulldev_close(int dev, int flag);
/* no operation - OK */
+extern int nulldev_read(dev_t dev, io_req_t ior);
/* no operation - OK */
+extern io_return_t nulldev_getstat(dev_t dev, int flavor, int *data, natural_t
*count); /* no operation - OK */
+extern io_return_t nulldev_setstat(dev_t dev, int flavor, int *data, natural_t
count); /* no operation - OK */
+extern int nulldev_portdeath(dev_t dev, mach_port_t port);
/* no operation - OK */
extern int nodev(); /* no operation - error */
-extern vm_offset_t nomap(); /* no operation - error */
+extern int nomap(dev_t dev, off_t off, int prot); /* no operation
- error */
/*
* Flavor constants for d_dev_info routine
diff --git a/device/dev_name.c b/device/dev_name.c
index de9e360..3f37533 100644
--- a/device/dev_name.c
+++ b/device/dev_name.c
@@ -39,7 +39,38 @@
/*
* Routines placed in empty entries in the device tables
*/
-int nulldev()
+int nulldev(void)
+{
+ return (D_SUCCESS);
+}
+
+int nulldev_open(dev_t dev, int flag, io_req_t ior)
+{
+ return (D_SUCCESS);
+}
+
+void nulldev_close(int dev, int flag)
+{
+ return;
+}
+
+int nulldev_read(dev_t dev, io_req_t ior)
+{
+ return (D_SUCCESS);
+}
+
+
+io_return_t nulldev_getstat(dev_t dev, int flavor, int *data, natural_t *count)
+{
+ return (D_SUCCESS);
+}
+
+io_return_t nulldev_setstat(dev_t dev, int flavor, int *data, natural_t count)
+{
+ return (D_SUCCESS);
+}
+
+int nulldev_portdeath(dev_t dev, mach_port_t port)
{
return (D_SUCCESS);
}
@@ -49,8 +80,8 @@ int nodev()
return (D_INVALID_OPERATION);
}
-vm_offset_t
-nomap()
+int
+nomap(dev_t dev, off_t off, int prot)
{
return (D_INVALID_OPERATION);
}
diff --git a/device/ds_routines.c b/device/ds_routines.c
index ee575e5..cc24add 100644
--- a/device/ds_routines.c
+++ b/device/ds_routines.c
@@ -639,7 +639,7 @@ device_close(device)
/*
* Close the device
*/
- (*device->dev_ops->d_close)(device->dev_number);
+ (*device->dev_ops->d_close)(device->dev_number, 0);
/*
* Finally mark it closed. If someone else is trying
diff --git a/device/kmsg.c b/device/kmsg.c
index c8bd897..586db24 100644
--- a/device/kmsg.c
+++ b/device/kmsg.c
@@ -77,14 +77,14 @@ kmsgopen (dev_t dev, int flag, io_req_t ior)
}
/* Kernel Message Close Handler */
-io_return_t
-kmsgclose (dev_t dev, int flag)
+void
+kmsgclose (int dev, int flag)
{
simple_lock (&kmsg_lock);
kmsg_in_use = 0;
simple_unlock (&kmsg_lock);
- return D_SUCCESS;
+ return;
}
static boolean_t kmsg_read_done (io_req_t ior);
diff --git a/device/kmsg.h b/device/kmsg.h
index b8c1f36..8d8526b 100644
--- a/device/kmsg.h
+++ b/device/kmsg.h
@@ -8,7 +8,7 @@
#include <device/io_req.h>
io_return_t kmsgopen (dev_t dev, int flag, io_req_t ior);
-io_return_t kmsgclose (dev_t dev, int flag);
+void kmsgclose (int dev, int flag);
io_return_t kmsgread (dev_t dev, io_req_t ior);
io_return_t kmsggetstat (dev_t dev, int flavor,
int *data, unsigned int *count);
diff --git a/i386/i386at/com.c b/i386/i386at/com.c
index 7b184e3..2e4acb5 100644
--- a/i386/i386at/com.c
+++ b/i386/i386at/com.c
@@ -318,8 +318,8 @@ boolean_t com_reprobe(
return FALSE;
}
-io_return_t comopen(
- int dev,
+int comopen(
+ dev_t dev,
int flag,
io_req_t ior)
{
@@ -398,7 +398,7 @@ io_return_t comopen(
return result;
}
-io_return_t comclose(dev, flag)
+void comclose(dev, flag)
int dev;
int flag;
{
@@ -414,11 +414,11 @@ int flag;
if (comfifo[minor(dev)] != 0)
outb(INTR_ID(addr), 0x00); /* Disable fifos */
}
- return 0;
+ return;
}
-io_return_t comread(dev, ior)
-int dev;
+int comread(dev, ior)
+dev_t dev;
io_req_t ior;
{
return char_read(&com_tty[minor(dev)], ior);
diff --git a/i386/i386at/com.h b/i386/i386at/com.h
index ae9434d..3762c1f 100644
--- a/i386/i386at/com.h
+++ b/i386/i386at/com.h
@@ -71,9 +71,9 @@ comsetstat(
int *data,
natural_t count);
-extern io_return_t comopen(int dev, int flag, io_req_t ior);
-extern io_return_t comclose(int dev, int flag);
-extern io_return_t comread(int dev, io_req_t ior);
+extern int comopen(dev_t dev, int flag, io_req_t ior);
+extern void comclose(int dev, int flag);
+extern int comread(dev_t dev, io_req_t ior);
extern io_return_t comwrite(int dev, io_req_t ior);
extern io_return_t comportdeath(dev_t dev, mach_port_t port);
diff --git a/i386/i386at/conf.c b/i386/i386at/conf.c
index 4fcd81e..eea2d1f 100644
--- a/i386/i386at/conf.c
+++ b/i386/i386at/conf.c
@@ -81,9 +81,9 @@ struct dev_ops dev_name_list[] =
/* We don't assign a console here, when we find one via
cninit() we stick something appropriate here through the
indirect list */
- { "cn", nulldev, nulldev, nulldev,
- nulldev, nulldev, nulldev, nomap,
- nodev, nulldev, nulldev, 0,
+ { "cn", nulldev_open, nulldev_close, nulldev_read,
+ nulldev, nulldev_getstat, nulldev_setstat, nomap,
+ nodev, nulldev, nulldev_portdeath, 0,
nodev },
#ifndef MACH_HYP
@@ -93,9 +93,9 @@ struct dev_ops dev_name_list[] =
nodev },
#endif /* MACH_HYP */
- { timename, timeopen, timeclose, nulldev,
- nulldev, nulldev, nulldev, timemmap,
- nodev, nulldev, nulldev, 0,
+ { timename, timeopen, timeclose, nulldev_read,
+ nulldev, nulldev_getstat, nulldev_setstat, timemmap,
+ nodev, nulldev, nulldev_portdeath, 0,
nodev },
#ifndef MACH_HYP
@@ -114,25 +114,25 @@ struct dev_ops dev_name_list[] =
#endif
{ mousename, mouseopen, mouseclose, mouseread,
- nodev, mousegetstat, nulldev, nomap,
- nodev, nulldev, nulldev, 0,
+ nodev, mousegetstat, nulldev_setstat, nomap,
+ nodev, nulldev, nulldev_portdeath, 0,
nodev },
{ kbdname, kbdopen, kbdclose, kbdread,
nodev, kbdgetstat, kbdsetstat, nomap,
- nodev, nulldev, nulldev, 0,
+ nodev, nulldev, nulldev_portdeath, 0,
nodev },
- { memname, nulldev, nulldev, nodev,
- nodev, nodev, nodev, memmmap,
- nodev, nulldev, nulldev, 0,
+ { memname, nulldev_open, nulldev_close, nulldev_read,
+ nodev, nulldev_getstat, nulldev_setstat, memmmap,
+ nodev, nulldev, nulldev_portdeath, 0,
nodev },
#endif /* MACH_HYP */
#ifdef MACH_KMSG
{ kmsgname, kmsgopen, kmsgclose, kmsgread,
- nodev, kmsggetstat, nodev, nomap,
- nodev, nulldev, nulldev, 0,
+ nodev, kmsggetstat, nulldev_setstat, nomap,
+ nodev, nulldev, nulldev_portdeath, 0,
nodev },
#endif
diff --git a/i386/i386at/kd.c b/i386/i386at/kd.c
index 5605257..b8b0e71 100644
--- a/i386/i386at/kd.c
+++ b/i386/i386at/kd.c
@@ -525,14 +525,14 @@ int flag;
/*ARGSUSED*/
int
kdread(dev, uio)
-int dev;
-struct uio *uio;
+dev_t dev;
+io_req_t uio;
{
struct tty *tp;
tp = &kd_tty;
tp->t_state |= TS_CARR_ON;
- return((*linesw[kd_tty.t_line].l_read)(tp, uio));
+ return((*linesw[kd_tty.t_line].l_read)(tp, (struct uio *)uio));
}
@@ -565,7 +565,7 @@ int
kdmmap(dev, off, prot)
dev_t dev;
off_t off;
- int prot;
+ vm_prot_t prot;
{
if ((u_int) off >= (128*1024))
return(-1);
diff --git a/i386/i386at/kd.h b/i386/i386at/kd.h
index d97fdd5..fa3e7d4 100644
--- a/i386/i386at/kd.h
+++ b/i386/i386at/kd.h
@@ -750,7 +750,7 @@ extern void kdb_kintr(void);
extern int kdopen(dev_t dev, int flag, io_req_t ior);
extern void kdclose(int dev, int flag);
-extern int kdread(int dev, struct uio *uio);
+extern int kdread(dev_t dev, io_req_t uio);
extern int kdwrite(int dev, struct uio *uio);
extern io_return_t kdgetstat(
@@ -766,7 +766,7 @@ extern io_return_t kdsetstat(
natural_t count);
extern int kdportdeath(dev_t dev, mach_port_t port);
-extern int kdmmap(dev_t dev, off_t off, int prot);
+extern int kdmmap(dev_t dev, off_t off, vm_prot_t prot);
boolean_t kdcheckmagic(Scancode scancode);
diff --git a/i386/i386at/kd_event.c b/i386/i386at/kd_event.c
index db14225..425afb1 100644
--- a/i386/i386at/kd_event.c
+++ b/i386/i386at/kd_event.c
@@ -110,9 +110,10 @@ kbdinit()
/*ARGSUSED*/
int
-kbdopen(dev, flags)
+kbdopen(dev, flags, ior)
dev_t dev;
int flags;
+ io_req_t ior;
{
spl_t o_pri = spltty();
kdinit();
@@ -131,7 +132,7 @@ kbdopen(dev, flags)
/*ARGSUSED*/
void
kbdclose(dev, flags)
- dev_t dev;
+ int dev;
int flags;
{
spl_t s = SPLKD();
diff --git a/i386/i386at/kd_event.h b/i386/i386at/kd_event.h
index f1295cb..5298567 100644
--- a/i386/i386at/kd_event.h
+++ b/i386/i386at/kd_event.h
@@ -30,8 +30,8 @@ extern void X_kdb_enter (void);
extern void X_kdb_exit (void);
-extern int kbdopen(dev_t dev, int flags);
-extern void kbdclose(dev_t dev, int flags);
+extern int kbdopen(dev_t dev, int flags, io_req_t ior);
+extern void kbdclose(int dev, int flags);
extern int kbdread(dev_t dev, io_req_t ior);
extern io_return_t kbdgetstat(
diff --git a/i386/i386at/kd_mouse.c b/i386/i386at/kd_mouse.c
index 5a80474..178c470 100644
--- a/i386/i386at/kd_mouse.c
+++ b/i386/i386at/kd_mouse.c
@@ -147,9 +147,10 @@ int track_man[10];
/*ARGSUSED*/
int
-mouseopen(dev, flags)
+mouseopen(dev, flags, ior)
dev_t dev;
int flags;
+ io_req_t ior;
{
if (mouse_in_use)
return (D_ALREADY_OPEN);
@@ -238,7 +239,7 @@ kd_mouse_open(dev, mouse_pic)
*/
void
mouseclose(dev, flags)
- dev_t dev;
+ int dev;
int flags;
{
switch (mouse_type) {
diff --git a/i386/i386at/kd_mouse.h b/i386/i386at/kd_mouse.h
index ad07c6c..ec4fe7a 100644
--- a/i386/i386at/kd_mouse.h
+++ b/i386/i386at/kd_mouse.h
@@ -54,8 +54,8 @@ extern void mouse_packet_mouse_system_mouse (u_char
*mousebuf);
extern void mouse_packet_ibm_ps2_mouse (u_char *mousebuf);
-extern int mouseopen(dev_t dev, int flags);
-extern void mouseclose(dev_t dev, int flags);
+extern int mouseopen(dev_t dev, int flags, io_req_t ior);
+extern void mouseclose(int dev, int flags);
extern int mouseread(dev_t dev, io_req_t ior);
extern io_return_t mousegetstat(
diff --git a/i386/i386at/lpr.c b/i386/i386at/lpr.c
index 3942335..8e065c2 100644
--- a/i386/i386at/lpr.c
+++ b/i386/i386at/lpr.c
@@ -106,7 +106,7 @@ void lprattach(struct bus_device *dev)
int
lpropen(dev, flag, ior)
-int dev;
+dev_t dev;
int flag;
io_req_t ior;
{
@@ -151,7 +151,7 @@ u_short addr = (u_short)
lprinfo[unit]->address;
int
lprread(dev, ior)
-int dev;
+dev_t dev;
io_req_t ior;
{
return char_read(&lpr_tty[minor(dev)], ior);
diff --git a/i386/i386at/lpr.h b/i386/i386at/lpr.h
index 820d0ab..0ca862a 100644
--- a/i386/i386at/lpr.h
+++ b/i386/i386at/lpr.h
@@ -57,9 +57,9 @@ lprsetstat(
void lprpr_addr(unsigned short addr);
-extern int lpropen(int dev, int flag, io_req_t ior);
+extern int lpropen(dev_t dev, int flag, io_req_t ior);
extern void lprclose(int dev, int flag);
-extern int lprread(int dev, io_req_t ior);
+extern int lprread(dev_t dev, io_req_t ior);
extern int lprwrite(int dev, io_req_t ior);
extern int lprportdeath(dev_t dev, mach_port_t port);
diff --git a/i386/i386at/mem.c b/i386/i386at/mem.c
index 5e51676..64a5f0b 100644
--- a/i386/i386at/mem.c
+++ b/i386/i386at/mem.c
@@ -32,8 +32,8 @@
/*ARGSUSED*/
int
memmmap(dev, off, prot)
-int dev;
-vm_offset_t off;
+dev_t dev;
+off_t off;
vm_prot_t prot;
{
if (off == 0)
diff --git a/i386/i386at/mem.h b/i386/i386at/mem.h
index 3d6a96c..5444cc5 100644
--- a/i386/i386at/mem.h
+++ b/i386/i386at/mem.h
@@ -19,6 +19,6 @@
#ifndef _MEM_H_
#define _MEM_H_
-extern int memmmap(int dev, vm_offset_t off, vm_prot_t prot);
+extern int memmmap(dev_t dev, off_t off, vm_prot_t prot);
#endif /* _MEM_H_ */
diff --git a/i386/i386at/model_dep.c b/i386/i386at/model_dep.c
index 1f1785e..93b0127 100644
--- a/i386/i386at/model_dep.c
+++ b/i386/i386at/model_dep.c
@@ -616,8 +616,8 @@ void c_boot_entry(vm_offset_t bi)
int
timemmap(dev, off, prot)
- int dev;
- int off;
+ dev_t dev;
+ off_t off;
vm_prot_t prot;
{
extern time_value_t *mtime;
diff --git a/i386/i386at/model_dep.h b/i386/i386at/model_dep.h
index 7357314..2d2d342 100644
--- a/i386/i386at/model_dep.h
+++ b/i386/i386at/model_dep.h
@@ -21,7 +21,7 @@
#include <mach/vm_prot.h>
-extern int timemmap(int dev, int off, vm_prot_t prot);
+extern int timemmap(dev_t dev, off_t off, vm_prot_t prot);
/*
* Halt a cpu.
diff --git a/kern/mach_clock.c b/kern/mach_clock.c
index 29a14c9..8190cea 100644
--- a/kern/mach_clock.c
+++ b/kern/mach_clock.c
@@ -499,13 +499,13 @@ void mapable_time_init()
update_mapped_time(&time);
}
-int timeopen()
+int timeopen(dev_t dev, int flag, io_req_t ior)
{
return(0);
}
-int timeclose()
+void timeclose(int dev, int flag)
{
- return(0);
+ return;
}
/*
diff --git a/kern/mach_clock.h b/kern/mach_clock.h
index 72189af..f3698c1 100644
--- a/kern/mach_clock.h
+++ b/kern/mach_clock.h
@@ -29,7 +29,10 @@
#include <mach/time_value.h>
#include <kern/host.h>
#include <kern/queue.h>
+#include <sys/types.h>
+struct io_req;
+typedef struct io_req *io_req_t;
/* Timers in kernel. */
extern unsigned long elapsed_ticks; /* number of ticks elapsed since bootup
*/
@@ -104,7 +107,7 @@ extern void mapable_time_init (void);
extern void timeout(timer_func_t *fcn, void *param, int interval);
extern boolean_t untimeout(timer_func_t *fcn, void *param);
-extern int timeopen(void);
-extern int timeclose(void);
+extern int timeopen(dev_t dev, int flag, io_req_t ior);
+extern void timeclose(int dev, int flag);
#endif /* _KERN_MACH_CLOCK_H_ */
--
1.8.1.4
- [PATCH 02/18] i386/i386at/lpr.c: fix argument list, (continued)
- [PATCH 02/18] i386/i386at/lpr.c: fix argument list, Marin Ramesa, 2013/12/06
- [PATCH 08/18] kern/boot_script.c: move struct definitions to a header file, Marin Ramesa, 2013/12/06
- [PATCH 09/18] kern/bootstrap.c: move struct definition to a header file, Marin Ramesa, 2013/12/06
- [PATCH 10/18] kern/startup.c: use boolean values, Marin Ramesa, 2013/12/06
- [PATCH 12/18] kern/debug.c: fix implicit declaration of function, Marin Ramesa, 2013/12/06
- [PATCH 11/18] kern/exception.c: move struct definition to a header file, Marin Ramesa, 2013/12/06
- [PATCH 14/18] Fix initialization from incompatible pointer type,
Marin Ramesa <=
- [PATCH 13/18] kern/machine.c: fix implicit declaration of function, Marin Ramesa, 2013/12/06
- [PATCH 15/18] i386/i386at/com.c: fix initialization from incompatible pointer type, Marin Ramesa, 2013/12/06
- [PATCH 16/18] i386/i386at/com.c: fix assignment from incompatible pointer type, Marin Ramesa, 2013/12/06
- [PATCH 17/18] i386/i386at/kd_event.c: fix difference in signedness, Marin Ramesa, 2013/12/06
- [PATCH 18/18] i386/i386at/lpr.c: fix initalization from incompatible pointer type, Marin Ramesa, 2013/12/06