EPICS Home

Experimental Physics and Industrial Control System


 
1994  1995  1996  1997  1998  1999  2000  2001  2002  2003  2004  2005  2006  2007  2008  2009  2010  2011  2012  2013  2014  2015  2016  <20172018  2019  2020  2021  2022  2023  2024  Index 1994  1995  1996  1997  1998  1999  2000  2001  2002  2003  2004  2005  2006  2007  2008  2009  2010  2011  2012  2013  2014  2015  2016  <20172018  2019  2020  2021  2022  2023  2024 
<== Date ==> <== Thread ==>

Subject: RE: Problem in macLib macExpandString?
From: Mark Rivers <[email protected]>
To: EPICS Tech-Talk <[email protected]>
Date: Sun, 16 Apr 2017 20:35:12 +0000
I've written a little test program that I think proves there is a bug in macExpandString:

Here is the program.  It defines the macros A and B.  It does not define the macro C.  It then calls macExpandString 3 times.  The first time it references only macros A and B, the second time A, B, C in that order, and the third time C, A, B in that order.

#####################################
#include <stdio.h>
#include <macLib.h>

int main(int argc, char *argv[])
{
  MAC_HANDLE *macHandle;
  char **macPairs;
  char expandOutput[100];
  const char *test1 = "$(A)$(B)";
  const char *test2 = "$(A)$(B)$(C)";
  const char *test3 = "$(C)$(B)$(A)";
  int status;

  macCreateHandle(&macHandle, 0);
  status = macParseDefns(macHandle, "A=1,B=2", &macPairs);
  status = macInstallMacros(macHandle, macPairs);

  status = macExpandString(macHandle, test1, expandOutput, sizeof(expandOutput));
  printf("Test1 input=%s, status=%d\n", test1, status);
  status = macExpandString(macHandle, test2, expandOutput, sizeof(expandOutput));
  printf("Test2 input=%s, status=%d\n", test2, status);
  status = macExpandString(macHandle, test3, expandOutput, sizeof(expandOutput));
  printf("Test3 input=%s, status=%d\n", test3, status);

  return 0;
}
#####################################

Here is the output:

corvette:ADCore/ADApp/ADSrc>../../bin/linux-x86_64/test_macExpandString
Test1 input=$(A)$(B), status=2
Test2 input=$(A)$(B)$(C), status=-16
Test3 input=$(C)$(B)$(A), status=16

The first 2 tests results are OK.  When only A and B are referenced it returns 2 characters as expected.  When the undefined C is the last macro in the string macExpandString returns -16, which is correct.  However, when the undefined C is not the last macro in the string macExpandString returns a positive number.  This is incorrect according to the documentation for macExpandString (http://www.aps.anl.gov/epics/base/R3-15/5-docs/AppDevGuide.pdf page 281), which says:

/*following returns #chars copied, <0 if any macros are undefined*/
long macExpandString(
    MAC_HANDLE *handle,    /* opaque handle */
    char *src,             /* source string */
    char *dest,            /* destination string */
    long maxlen            /* maximum number of characters to copy */
                           /* to destination string */
);

I'm surprised this has not been seen previously, so perhaps I am doing something wrong?

Thanks,
Mark





________________________________
From: Mark Rivers
Sent: Sunday, April 16, 2017 2:41 PM
To: EPICS Tech-Talk
Subject: Problem in macLib macExpandString?

I am trying to use macLib to do macro substitution in base 3.15.5.  It is generally working.  However sometimes when there is an undefined macro the return value from macExpandString is not negative when it should be.

This is the code I am using to call macExpandString, with some debugging printf calls.  It prints the value returned by macValueExpand, as well as the input and output strings.

        // Create a temporary buffer 10 times larger than input buffer
        int bufferSize = buffer.length() * 10;
        char *tmpBuffer = (char *)malloc(bufferSize);
printf("Calling macExpandString, input length=%d, output buffer size=%d\n", (int)buffer.length(), bufferSize);
        status = macExpandString(macHandle, buffer.c_str(), tmpBuffer, bufferSize);
printf("macExpandString returned %d\n", status);
printf("input:\n########\n%s\n########\n\n", buffer.c_str());
printf("output:\n########\n%s\n########\n\n", tmpBuffer);


Here is an example.  In this case the CAMERA macro is not defined.

#####################################################################################################################
Calling macExpandString, input length=1013, output buffer size=10130
macLib: macro CAMERA is undefined (expanding string <?xml version="1.0" standalone="no" ?>
<!-- Attributes -->
<Attributes
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
    xsi:noNamespaceSchemaLocation="../../../../../ADCore/XML_schema/NDAttributes.xsd"
    >
    <Attribute name="AcquireTime"         type="EPICS_PV" source="$(CAMERA)AcquireTime"         dbrtype="DBR_NATIVE"  description="Camera acquire time"/>
    <Attribute name="RingCurrent"         type="EPICS_PV" source="S:SRcurrentAI"                dbrtype="DBR_NATIVE"  description="Storage ring current"/>
    <Attribute name="RingCurrent_EGU"     type="EPICS_PV" source="S:SRcurrentAI.EGU"            dbrtype="DBR_NATIVE"  description="Storage ring current units"/>
    <Attribute name="ID_Energy"           type="EPICS_PV" source="$(ID)Energy"                  dbrtype="DBR_NATIVE"  description="Undulator energy"/>
    <Attribute name="ID_Energy_EGU"       type="EPICS_PV" source="$(ID)Energy.EGU"              dbrtype="DBR_NATIVE"  description="Undulator energy units"/>
</Attributes>
)
macExpandString returned 1027
input:
########
<?xml version="1.0" standalone="no" ?>
<!-- Attributes -->
<Attributes
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
    xsi:noNamespaceSchemaLocation="../../../../../ADCore/XML_schema/NDAttributes.xsd"
    >
    <Attribute name="AcquireTime"         type="EPICS_PV" source="$(CAMERA)AcquireTime"         dbrtype="DBR_NATIVE"  description="Camera acquire time"/>
    <Attribute name="RingCurrent"         type="EPICS_PV" source="S:SRcurrentAI"                dbrtype="DBR_NATIVE"  description="Storage ring current"/>
    <Attribute name="RingCurrent_EGU"     type="EPICS_PV" source="S:SRcurrentAI.EGU"            dbrtype="DBR_NATIVE"  description="Storage ring current units"/>
    <Attribute name="ID_Energy"           type="EPICS_PV" source="$(ID)Energy"                  dbrtype="DBR_NATIVE"  description="Undulator energy"/>
    <Attribute name="ID_Energy_EGU"       type="EPICS_PV" source="$(ID)Energy.EGU"              dbrtype="DBR_NATIVE"  description="Undulator energy units"/>
</Attributes>

########

output:
########
<?xml version="1.0" standalone="no" ?>
<!-- Attributes -->
<Attributes
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
    xsi:noNamespaceSchemaLocation="../../../../../ADCore/XML_schema/NDAttributes.xsd"
    >
    <Attribute name="AcquireTime"         type="EPICS_PV" source="$(CAMERA,undefined)AcquireTime"         dbrtype="DBR_NATIVE"  description="Camera acquire time"/>
    <Attribute name="RingCurrent"         type="EPICS_PV" source="S:SRcurrentAI"                dbrtype="DBR_NATIVE"  description="Storage ring current"/>
    <Attribute name="RingCurrent_EGU"     type="EPICS_PV" source="S:SRcurrentAI.EGU"            dbrtype="DBR_NATIVE"  description="Storage ring current units"/>
    <Attribute name="ID_Energy"           type="EPICS_PV" source="ID13us:Energy"                  dbrtype="DBR_NATIVE"  description="Undulator energy"/>
    <Attribute name="ID_Energy_EGU"       type="EPICS_PV" source="ID13us:Energy.EGU"              dbrtype="DBR_NATIVE"  description="Undulator energy units"/>
</Attributes>

########

#####################################################################################################################

Note above that macExpand string is printing an error message as it should.  However, it is returning a positive integer 1037, while it should be returning a negative value because there was an undefined macro.


If instead of CAMERA being undefined I don't define ID instead I get this output:

#####################################################################################################################
Calling macExpandString, input length=1013, output buffer size=10130
macLib: macro ID is undefined (expanding string <?xml version="1.0" standalone="no" ?>
<!-- Attributes -->
<Attributes
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
    xsi:noNamespaceSchemaLocation="../../../../../ADCore/XML_schema/NDAttributes.xsd"
    >
    <Attribute name="AcquireTime"         type="EPICS_PV" source="$(CAMERA)AcquireTime"         dbrtype="DBR_NATIVE"  description="Camera acquire time"/>
    <Attribute name="RingCurrent"         type="EPICS_PV" source="S:SRcurrentAI"                dbrtype="DBR_NATIVE"  description="Storage ring current"/>
    <Attribute name="RingCurrent_EGU"     type="EPICS_PV" source="S:SRcurrentAI.EGU"            dbrtype="DBR_NATIVE"  description="Storage ring current units"/>
    <Attribute name="ID_Energy"           type="EPICS_PV" source="$(ID)Energy"                  dbrtype="DBR_NATIVE"  description="Undulator energy"/>
    <Attribute name="ID_Energy_EGU"       type="EPICS_PV" source="$(ID)Energy.EGU"              dbrtype="DBR_NATIVE"  description="Undulator energy units"/>
</Attributes>
)
macLib: macro ID is undefined (expanding string <?xml version="1.0" standalone="no" ?>
<!-- Attributes -->
<Attributes
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
    xsi:noNamespaceSchemaLocation="../../../../../ADCore/XML_schema/NDAttributes.xsd"
    >
    <Attribute name="AcquireTime"         type="EPICS_PV" source="$(CAMERA)AcquireTime"         dbrtype="DBR_NATIVE"  description="Camera acquire time"/>
    <Attribute name="RingCurrent"         type="EPICS_PV" source="S:SRcurrentAI"                dbrtype="DBR_NATIVE"  description="Storage ring current"/>
    <Attribute name="RingCurrent_EGU"     type="EPICS_PV" source="S:SRcurrentAI.EGU"            dbrtype="DBR_NATIVE"  description="Storage ring current units"/>
    <Attribute name="ID_Energy"           type="EPICS_PV" source="$(ID)Energy"                  dbrtype="DBR_NATIVE"  description="Undulator energy"/>
    <Attribute name="ID_Energy_EGU"       type="EPICS_PV" source="$(ID)Energy.EGU"              dbrtype="DBR_NATIVE"  description="Undulator energy units"/>
</Attributes>
)
macExpandString returned -1036
input:
########
<?xml version="1.0" standalone="no" ?>
<!-- Attributes -->
<Attributes
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
    xsi:noNamespaceSchemaLocation="../../../../../ADCore/XML_schema/NDAttributes.xsd"
    >
    <Attribute name="AcquireTime"         type="EPICS_PV" source="$(CAMERA)AcquireTime"         dbrtype="DBR_NATIVE"  description="Camera acquire time"/>
    <Attribute name="RingCurrent"         type="EPICS_PV" source="S:SRcurrentAI"                dbrtype="DBR_NATIVE"  description="Storage ring current"/>
    <Attribute name="RingCurrent_EGU"     type="EPICS_PV" source="S:SRcurrentAI.EGU"            dbrtype="DBR_NATIVE"  description="Storage ring current units"/>
    <Attribute name="ID_Energy"           type="EPICS_PV" source="$(ID)Energy"                  dbrtype="DBR_NATIVE"  description="Undulator energy"/>
    <Attribute name="ID_Energy_EGU"       type="EPICS_PV" source="$(ID)Energy.EGU"              dbrtype="DBR_NATIVE"  description="Undulator energy units"/>
</Attributes>

########

output:
########
<?xml version="1.0" standalone="no" ?>
<!-- Attributes -->
<Attributes
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
    xsi:noNamespaceSchemaLocation="../../../../../ADCore/XML_schema/NDAttributes.xsd"
    >
    <Attribute name="AcquireTime"         type="EPICS_PV" source="13SIM1:cam1:AcquireTime"         dbrtype="DBR_NATIVE"  description="Camera acquire time"/>
    <Attribute name="RingCurrent"         type="EPICS_PV" source="S:SRcurrentAI"                dbrtype="DBR_NATIVE"  description="Storage ring current"/>
    <Attribute name="RingCurrent_EGU"     type="EPICS_PV" source="S:SRcurrentAI.EGU"            dbrtype="DBR_NATIVE"  description="Storage ring current units"/>
    <Attribute name="ID_Energy"           type="EPICS_PV" source="$(ID,undefined)Energy"                  dbrtype="DBR_NATIVE"  description="Undulator energy"/>
    <Attribute name="ID_Energy_EGU"       type="EPICS_PV" source="$(ID,undefined)Energy.EGU"              dbrtype="DBR_NATIVE"  description="Undulator energy units"/>
</Attributes>

########
#####################################################################################################################

This is behaving correctly, macExpandString is returning a negative number, -1036 as it should.

Am I doing something wrong or is this a bug?


Thanks,
Mark


Replies:
RE: Problem in macLib macExpandString? Mark Rivers
References:
Problem in macLib macExpandString? Mark Rivers

Navigate by Date:
Prev: Problem in macLib macExpandString? Mark Rivers
Next: Re: CAS: partial (damaged?) UDP msg Michael Davidsaver
Index: 1994  1995  1996  1997  1998  1999  2000  2001  2002  2003  2004  2005  2006  2007  2008  2009  2010  2011  2012  2013  2014  2015  2016  <20172018  2019  2020  2021  2022  2023  2024 
Navigate by Thread:
Prev: Problem in macLib macExpandString? Mark Rivers
Next: RE: Problem in macLib macExpandString? Mark Rivers
Index: 1994  1995  1996  1997  1998  1999  2000  2001  2002  2003  2004  2005  2006  2007  2008  2009  2010  2011  2012  2013  2014  2015  2016  <20172018  2019  2020  2021  2022  2023  2024