Multiple PMU implementation provide their private getl() implementation.
Provide a common implementation to avoid code duplication and improve
reuse.  Also change the PMU files to reuse the common implementation.

Signed-off-by: Hendrik Brueckner <brueck...@linux.vnet.ibm.com>
---
 lib/pfmlib_arm.c            |   55 +-----------------------------------------
 lib/pfmlib_common.c         |   55 ++++++++++++++++++++++++++++++++++++++++++
 lib/pfmlib_mips.c           |   55 +-----------------------------------------
 lib/pfmlib_perf_event_pmu.c |   56 +------------------------------------------
 lib/pfmlib_priv.h           |    1 +
 lib/pfmlib_sparc.c          |   55 +-----------------------------------------
 6 files changed, 60 insertions(+), 217 deletions(-)

diff --git a/lib/pfmlib_arm.c b/lib/pfmlib_arm.c
index fdd885e..a49ca45 100644
--- a/lib/pfmlib_arm.c
+++ b/lib/pfmlib_arm.c
@@ -44,59 +44,6 @@ pfm_arm_config_t pfm_arm_cfg;
 
 #ifdef CONFIG_PFMLIB_OS_LINUX
 /*
- * getl(): our own equivalent to GNU getline() extension.
- * This avoids a dependency on having a C library with
- * support for getline().
- */
-static int
-getl(char **buffer, size_t *len, FILE *fp)
-{
-#define        GETL_DFL_LEN    32
-       char *b;
-       int c;
-       size_t maxsz, maxi, i = 0, d;
-
-       if (!len || !fp || !buffer)
-               return -1;
-
-       b = *buffer;
-
-       if (!b)
-               *len = 0;
-
-       maxsz = *len;
-       maxi = maxsz - 2;
-
-       while ((c = fgetc(fp)) != EOF) {
-               if (maxsz == 0 || i == maxi) {
-                       if (maxsz == 0)
-                               maxsz = GETL_DFL_LEN;
-                       else
-                               maxsz <<= 1;
-
-                       if (*buffer)
-                               d = &b[i] - *buffer;
-                       else
-                               d = 0;
-
-                       *buffer = realloc(*buffer, maxsz);
-                       if (!*buffer)
-                               return -1;
-
-                       b = *buffer + d;
-                       maxi = maxsz - d - 2;
-                       i = 0;
-                       *len = maxsz;
-               }
-               b[i++] = c;
-               if (c == '\n')
-                       break;
-       }
-       b[i] = '\0';
-       return c != EOF ? 0 : -1;
-}
-
-/*
  * helper function to retrieve one value from /proc/cpuinfo
  * for internal libpfm use only
  * attr: the attribute (line) to look for
@@ -128,7 +75,7 @@ pfmlib_getcpuinfo_attr(const char *attr, char *ret_buf, 
size_t maxlen)
        if (fp == NULL)
                return -1;
 
-       while(getl(&buffer, &buf_len, fp) != -1){
+       while(pfmlib_getl(&buffer, &buf_len, fp) != -1){
 
                /* skip  blank lines */
                if (*buffer == '\n')
diff --git a/lib/pfmlib_common.c b/lib/pfmlib_common.c
index 77f6030..765f45b 100644
--- a/lib/pfmlib_common.c
+++ b/lib/pfmlib_common.c
@@ -225,6 +225,61 @@ __pfm_vbprintf(const char *fmt, ...)
 }
 
 /*
+ * pfmlib_getl: our own equivalent to GNU getline() extension.
+ * This avoids a dependency on having a C library with
+ * support for getline().
+ */
+int
+pfmlib_getl(char **buffer, size_t *len, FILE *fp)
+{
+#define        GETL_DFL_LEN    32
+       char *b;
+       int c;
+       size_t maxsz, maxi, d, i = 0;
+
+       if (!len || !fp || !buffer)
+               return -1;
+
+       b = *buffer;
+
+       if (!b)
+               *len = 0;
+
+       maxsz = *len;
+       maxi = maxsz - 2;
+
+       while ((c = fgetc(fp)) != EOF) {
+               if (maxsz == 0 || i == maxi) {
+                       if (maxsz == 0)
+                               maxsz = GETL_DFL_LEN;
+                       else
+                               maxsz <<= 1;
+
+                       if (*buffer)
+                               d = &b[i] - *buffer;
+                       else
+                               d = 0;
+
+                       *buffer = realloc(*buffer, maxsz);
+                       if (!*buffer)
+                               return -1;
+
+                       b = *buffer + d;
+                       maxi = maxsz - d - 2;
+                       i = 0;
+                       *len = maxsz;
+               }
+               b[i++] = c;
+               if (c == '\n')
+                       break;
+       }
+       b[i] = '\0';
+       return c != EOF ? 0 : -1;
+}
+
+
+
+/*
  * append fmt+args to str such that the string is no
  * more than max characters incl. null termination
  */
diff --git a/lib/pfmlib_mips.c b/lib/pfmlib_mips.c
index 50a21ed..8357ea5 100644
--- a/lib/pfmlib_mips.c
+++ b/lib/pfmlib_mips.c
@@ -45,59 +45,6 @@ static const pfmlib_attr_desc_t mips_mods[]={
 
 #ifdef CONFIG_PFMLIB_OS_LINUX
 /*
- * getl(): our own equivalent to GNU getline() extension.
- * This avoids a dependency on having a C library with
- * support for getline().
- */
-static int
-getl(char **buffer, size_t *len, FILE *fp)
-{
-#define        GETL_DFL_LEN    32
-       char *b;
-       int c;
-       size_t maxsz, maxi, i = 0, d;
-
-       if (!len || !fp || !buffer)
-               return -1;
-
-       b = *buffer;
-
-       if (!b)
-               *len = 0;
-
-       maxsz = *len;
-       maxi = maxsz - 2;
-
-       while ((c = fgetc(fp)) != EOF) {
-               if (maxsz == 0 || i == maxi) {
-                       if (maxsz == 0)
-                               maxsz = GETL_DFL_LEN;
-                       else
-                               maxsz <<= 1;
-
-                       if (*buffer)
-                               d = &b[i] - *buffer;
-                       else
-                               d = 0;
-
-                       *buffer = realloc(*buffer, maxsz);
-                       if (!*buffer)
-                               return -1;
-
-                       b = *buffer + d;
-                       maxi = maxsz - d - 2;
-                       i = 0;
-                       *len = maxsz;
-               }
-               b[i++] = c;
-               if (c == '\n')
-                       break;
-       }
-       b[i] = '\0';
-       return c != EOF ? 0 : -1;
-}
-
-/*
  * helper function to retrieve one value from /proc/cpuinfo
  * for internal libpfm use only
  * attr: the attribute (line) to look for
@@ -129,7 +76,7 @@ pfmlib_getcpuinfo_attr(const char *attr, char *ret_buf, 
size_t maxlen)
        if (fp == NULL)
                return -1;
 
-       while(getl(&buffer, &buf_len, fp) != -1){
+       while(pfmlib_getl(&buffer, &buf_len, fp) != -1){
 
                /* skip  blank lines */
                if (*buffer == '\n')
diff --git a/lib/pfmlib_perf_event_pmu.c b/lib/pfmlib_perf_event_pmu.c
index 7fc73fa..f00ac78 100644
--- a/lib/pfmlib_perf_event_pmu.c
+++ b/lib/pfmlib_perf_event_pmu.c
@@ -163,60 +163,6 @@ perf_attridx2um(int idx, int attr_idx)
 }
 
 /*
- * getl(): our own equivalent to GNU getline() extension.
- * This avoids a dependency on having a C library with
- * support for getline().
- */
-static int
-getl(char **buffer, size_t *len, FILE *fp)
-{
-#define        GETL_DFL_LEN    32
-       char *b;
-       int c;
-       size_t maxsz, maxi, i = 0, d;
-
-       if (!len || !fp || !buffer)
-               return -1;
-
-       b = *buffer;
-
-       if (!b)
-               *len = 0;
-
-       maxsz = *len;
-       maxi = maxsz - 2;
-
-       while ((c = fgetc(fp)) != EOF) {
-               if (maxsz == 0 || i == maxi) {
-                       if (maxsz == 0)
-                               maxsz = GETL_DFL_LEN;
-                       else
-                               maxsz <<= 1;
-
-                       if (*buffer)
-                               d = &b[i] - *buffer;
-                       else
-                               d = 0;
-
-                       *buffer = realloc(*buffer, maxsz);
-                       if (!*buffer)
-                               return -1;
-
-                       b = *buffer + d;
-                       maxi = maxsz - d - 2;
-                       i = 0;
-                       *len = maxsz;
-               }
-               b[i++] = c;
-               if (c == '\n')
-                       break;
-       }
-       b[i] = '\0';
-       return c != EOF ? 0 : -1;
-}
-
-
-/*
  * figure out the mount point of the debugfs filesystem
  *
  * returns -1 if none is found
@@ -234,7 +180,7 @@ get_debugfs_mnt(void)
        if (!fp)
                return -1;
 
-       while(getl(&buffer, &len, fp) != -1) {
+       while(pfmlib_getl(&buffer, &len, fp) != -1) {
 
                q = strchr(buffer, ' ');
                if (!q)
diff --git a/lib/pfmlib_priv.h b/lib/pfmlib_priv.h
index 3f651ab..7fb550a 100644
--- a/lib/pfmlib_priv.h
+++ b/lib/pfmlib_priv.h
@@ -169,6 +169,7 @@ extern pfmlib_config_t pfm_cfg;
 extern void __pfm_vbprintf(const char *fmt,...);
 extern void __pfm_dbprintf(const char *fmt,...);
 extern void pfmlib_strconcat(char *str, size_t max, const char *fmt, ...);
+extern int pfmlib_getl(char **buffer, size_t *len, FILE *fp);
 extern void pfmlib_compact_pattrs(pfmlib_event_desc_t *e, int i);
 #define evt_strcat(str, fmt, a...) pfmlib_strconcat(str, 
PFMLIB_EVT_MAX_NAME_LEN, fmt, a)
 
diff --git a/lib/pfmlib_sparc.c b/lib/pfmlib_sparc.c
index 97a4f96..f88b551 100644
--- a/lib/pfmlib_sparc.c
+++ b/lib/pfmlib_sparc.c
@@ -43,59 +43,6 @@ const pfmlib_attr_desc_t sparc_mods[]={
 
 #ifdef CONFIG_PFMLIB_OS_LINUX
 /*
- * getl(): our own equivalent to GNU getline() extension.
- * This avoids a dependency on having a C library with
- * support for getline().
- */
-static int
-getl(char **buffer, size_t *len, FILE *fp)
-{
-#define        GETL_DFL_LEN    32
-       char *b;
-       int c;
-       size_t maxsz, maxi, i = 0, d;
-
-       if (!len || !fp || !buffer)
-               return -1;
-
-       b = *buffer;
-
-       if (!b)
-               *len = 0;
-
-       maxsz = *len;
-       maxi = maxsz - 2;
-
-       while ((c = fgetc(fp)) != EOF) {
-               if (maxsz == 0 || i == maxi) {
-                       if (maxsz == 0)
-                               maxsz = GETL_DFL_LEN;
-                       else
-                               maxsz <<= 1;
-
-                       if (*buffer)
-                               d = &b[i] - *buffer;
-                       else
-                               d = 0;
-
-                       *buffer = realloc(*buffer, maxsz);
-                       if (!*buffer)
-                               return -1;
-
-                       b = *buffer + d;
-                       maxi = maxsz - d - 2;
-                       i = 0;
-                       *len = maxsz;
-               }
-               b[i++] = c;
-               if (c == '\n')
-                       break;
-       }
-       b[i] = '\0';
-       return c != EOF ? 0 : -1;
-}
-
-/*
  * helper function to retrieve one value from /proc/cpuinfo
  * for internal libpfm use only
  * attr: the attribute (line) to look for
@@ -127,7 +74,7 @@ pfmlib_getcpuinfo_attr(const char *attr, char *ret_buf, 
size_t maxlen)
        if (fp == NULL)
                return -1;
 
-       while(getl(&buffer, &buf_len, fp) != -1){
+       while(pfmlib_getl(&buffer, &buf_len, fp) != -1){
 
                /* skip  blank lines */
                if (*buffer == '\n')
-- 
1.7.5.4


------------------------------------------------------------------------------
Keep yourself connected to Go Parallel: 
INSIGHTS What's next for parallel hardware, programming and related areas?
Interviews and blogs by thought leaders keep you ahead of the curve.
http://goparallel.sourceforge.net
_______________________________________________
perfmon2-devel mailing list
perfmon2-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/perfmon2-devel

Reply via email to