view mercurial/cffi/osutilbuild.py @ 39203:fd17590655cf

zsh_completion: drop -w, add -S to _arguments From the docs: http://zsh.sourceforge.net/Doc/Release/Completion-System.html _arguments -w: "allow option stacking even if one or more of the options take arguments", so something like "-xy xarg yarg". Mercurial's command line parser doesn't support that, so the flag got removed in zsh 92584634d3d3 and bf8b61182043. _arguments -S: "do not complete options after a ‘--’ appearing on the line". By options it means things like "-x" and "--foo", but it will still complete arguments like files. Differential Revision: https://phab.mercurial-scm.org/D4262
author Anton Shestakov <av6@dwimlabs.net>
date Fri, 10 Aug 2018 08:33:27 +0800
parents 2dcb3d52ef41
children 2372284d9457
line wrap: on
line source

from __future__ import absolute_import

import cffi

ffi = cffi.FFI()
ffi.set_source("mercurial.cffi._osutil", """
#include <sys/attr.h>
#include <sys/vnode.h>
#include <unistd.h>
#include <fcntl.h>
#include <time.h>

typedef struct val_attrs {
    uint32_t          length;
    attribute_set_t   returned;
    attrreference_t   name_info;
    fsobj_type_t      obj_type;
    struct timespec   mtime;
    uint32_t          accessmask;
    off_t             datalength;
} __attribute__((aligned(4), packed)) val_attrs_t;
""", include_dirs=['mercurial'])
ffi.cdef('''

typedef uint32_t attrgroup_t;

typedef struct attrlist {
    uint16_t     bitmapcount; /* number of attr. bit sets in list */
    uint16_t   reserved;    /* (to maintain 4-byte alignment) */
    attrgroup_t commonattr;  /* common attribute group */
    attrgroup_t volattr;     /* volume attribute group */
    attrgroup_t dirattr;     /* directory attribute group */
    attrgroup_t fileattr;    /* file attribute group */
    attrgroup_t forkattr;    /* fork attribute group */
    ...;
};

typedef struct attribute_set {
    ...;
} attribute_set_t;

typedef struct attrreference {
    int attr_dataoffset;
    int attr_length;
    ...;
} attrreference_t;

typedef int ... off_t;

typedef struct val_attrs {
    uint32_t          length;
    attribute_set_t   returned;
    attrreference_t   name_info;
    uint32_t          obj_type;
    struct timespec   mtime;
    uint32_t          accessmask;
    off_t             datalength;
    ...;
} val_attrs_t;

/* the exact layout of the above struct will be figured out during build time */

typedef int ... time_t;

typedef struct timespec {
    time_t tv_sec;
    ...;
};

int getattrlist(const char* path, struct attrlist * attrList, void * attrBuf,
                size_t attrBufSize, unsigned int options);

int getattrlistbulk(int dirfd, struct attrlist * attrList, void * attrBuf,
                    size_t attrBufSize, uint64_t options);

#define ATTR_BIT_MAP_COUNT ...
#define ATTR_CMN_NAME ...
#define ATTR_CMN_OBJTYPE ...
#define ATTR_CMN_MODTIME ...
#define ATTR_CMN_ACCESSMASK ...
#define ATTR_CMN_ERROR ...
#define ATTR_CMN_RETURNED_ATTRS ...
#define ATTR_FILE_DATALENGTH ...

#define VREG ...
#define VDIR ...
#define VLNK ...
#define VBLK ...
#define VCHR ...
#define VFIFO ...
#define VSOCK ...

#define S_IFMT ...

int open(const char *path, int oflag, int perm);
int close(int);

#define O_RDONLY ...
''')

if __name__ == '__main__':
    ffi.compile()