Mac/Modules/res/resedit.py
##resource_body = """
##char *buf;
##int len;
##Handle h;
##
##if (!PyArg_ParseTuple(_args, "s#", &buf, &len))
##      return NULL;
##h = NewHandle(len);
##if ( h == NULL ) {
##      PyErr_NoMemory();
##      return NULL;
##}
##HLock(h);
##memcpy(*h, buf, len);
##HUnlock(h);
##_res = ResObj_New(h);
##return _res;
##"""
##
##f = ManualGenerator("Resource", resource_body)
##f.docstring = lambda: """Convert a string to a resource object.
##
##The created resource object is actually just a handle,
##apply AddResource() to write it to a resource file.
##See also the Handle() docstring.
##"""
##functions.append(f)

handle_body = """
char *buf;
int len;
Handle h;
ResourceObject *rv;

if (!PyArg_ParseTuple(_args, "s#", &buf, &len))
        return NULL;
h = NewHandle(len);
if ( h == NULL ) {
        PyErr_NoMemory();
        return NULL;
}
HLock(h);
memcpy(*h, buf, len);
HUnlock(h);
rv = (ResourceObject *)ResObj_New(h);
rv->ob_freeit = PyMac_AutoDisposeHandle;
_res = (PyObject *)rv;
return _res;
"""

f = ManualGenerator("Handle", handle_body)
f.docstring = lambda: """Convert a string to a Handle object.

Resource() and Handle() are very similar, but objects created with Handle() are
by default automatically DisposeHandle()d upon object cleanup. Use AutoDispose()
to change this.
"""
functions.append(f)

# Convert resources to other things.

as_xxx_body = """
_res = %sObj_New((%sHandle)_self->ob_itself);
return _res;
"""

def genresconverter(longname, shortname):

    f = ManualGenerator("as_%s"%longname, as_xxx_body%(shortname, longname))
    docstring =  "Return this resource/handle as a %s"%longname
    f.docstring = lambda docstring=docstring: docstring
    return f

resmethods.append(genresconverter("Control", "Ctl"))
resmethods.append(genresconverter("Menu", "Menu"))

# The definition of this one is MacLoadResource, so we do it by hand...

f = ResMethod(void, 'LoadResource',
    (Handle, 'theResource', InMode),
)
resmethods.append(f)

#
# A method to set the auto-dispose flag
#
AutoDispose_body = """
int onoff, old = 0;
if (!PyArg_ParseTuple(_args, "i", &onoff))
        return NULL;
if ( _self->ob_freeit )
        old = 1;
if ( onoff )
        _self->ob_freeit = PyMac_AutoDisposeHandle;
else
        _self->ob_freeit = NULL;
_res = Py_BuildValue("i", old);
return _res;
"""
f = ManualGenerator("AutoDispose", AutoDispose_body)
f.docstring = lambda: "(int)->int. Automatically DisposeHandle the object on Python object cleanup"
resmethods.append(f)