From: Jay Freeman (saurik) Date: Mon, 16 Dec 2013 12:43:33 +0000 (-0800) Subject: Use crazy __lambda{,_} macros to implement blocks. X-Git-Url: https://git.saurik.com/hfs.git/commitdiff_plain/29ed582f1dca3b615446c98a0c29fe7919480766 Use crazy __lambda{,_} macros to implement blocks. --- diff --git a/fsck_hfs/dfalib/SControl.c b/fsck_hfs/dfalib/SControl.c index 5c654b9..d75fd6c 100644 --- a/fsck_hfs/dfalib/SControl.c +++ b/fsck_hfs/dfalib/SControl.c @@ -288,7 +288,7 @@ CheckHFS( const char *rdevnode, int fsReadRef, int fsWriteRef, int checkLevel, * the message in question corresponds to a major or a minor error. If it's * major, we longjmp just above, which causes us to exit out early. */ - fsckSetBlock(fsckContext, fsckPhaseAfterMessage, (fsckBlock_t) ^(fsck_ctx_t c, int msgNum, va_list args) { + fsckSetBlock(fsckContext, fsckPhaseAfterMessage, __lambda(fsck_block_status_t, (fsck_ctx_t c, int msgNum, va_list args), { if (abs(msgNum) > E_FirstError && abs(msgNum) < E_LastError) { if (isMinorError(abs(msgNum), msgCounts) == 1) return fsckBlockContinue; @@ -297,7 +297,7 @@ CheckHFS( const char *rdevnode, int fsReadRef, int fsWriteRef, int checkLevel, } else { return fsckBlockContinue; } - }); + })); } } DoAgain: @@ -667,7 +667,7 @@ void ScavCtrl( SGlobPtr GPtr, UInt32 ScavOp, short *ScavRes ) blockSize, 0, jnlInfo.name, - ^(off_t start, void *data, size_t len) { + __lambda(int, (off_t start, void *data, size_t len), { Buf_t *buf; int rv; rv = CacheRead(&fscache, start, (int)len, &buf); @@ -677,7 +677,7 @@ void ScavCtrl( SGlobPtr GPtr, UInt32 ScavOp, short *ScavRes ) rv = CacheWrite(&fscache, buf, 0, kLockWrite); if (rv != 0) abort(); - return 0;} + return 0;}) ) == -1) { fsckPrint(GPtr->context, E_DirtyJournal); GPtr->JStat |= S_DirtyJournal; diff --git a/fsck_hfs/dfalib/fsck_journal.c b/fsck_hfs/dfalib/fsck_journal.c index 8f9f8a2..0836934 100644 --- a/fsck_hfs/dfalib/fsck_journal.c +++ b/fsck_hfs/dfalib/fsck_journal.c @@ -72,7 +72,7 @@ static swapper_t swappedEndian = { ^(uint64_t x) { return OSSwapInt64(x); } }; -typedef int (^journal_write_block_t)(off_t, void *, size_t); +typedef int (__lambda_ journal_write_block_t)(off_t, void *, size_t); // // this isn't a great checksum routine but it will do for now. @@ -367,7 +367,7 @@ journal_open(int jfd, size_t min_fs_blksize, // Blocksize of the data filesystem, journal blocksize must be at least this size uint32_t flags __unused, // Not used in this implementation const char *jdev_name, // The name of the journal device, for logging - int (^do_write_b)(off_t, void*, size_t)) + int (__lambda_ do_write_b)(off_t, void*, size_t)) { journal_header jhdr = { 0 }; swapper_t *jnlSwap; // Used to swap fields of the journal diff --git a/fsck_hfs/dfalib/fsck_journal.h b/fsck_hfs/dfalib/fsck_journal.h index 8b3ecbf..c930c69 100644 --- a/fsck_hfs/dfalib/fsck_journal.h +++ b/fsck_hfs/dfalib/fsck_journal.h @@ -103,6 +103,6 @@ int journal_open(int jdev, size_t min_fs_block_size, uint32_t flags, const char *jdev_name, - int (^do_write_b)(off_t, void *, size_t)); + int (__lambda_ do_write_b)(off_t, void *, size_t)); #endif /* !_FSCK_JOURNAL_H */ diff --git a/fsck_hfs/fsck_messages.h b/fsck_hfs/fsck_messages.h index ee2ba3e..db6e3c0 100644 --- a/fsck_hfs/fsck_messages.h +++ b/fsck_hfs/fsck_messages.h @@ -141,7 +141,7 @@ typedef enum fsck_block_phase_type fsck_block_phase_t; * the third is a va_list of the arguments for the message. */ -typedef fsck_block_status_t (^fsckBlock_t)(fsck_ctx_t, int, va_list); +typedef fsck_block_status_t (__lambda_ fsckBlock_t)(fsck_ctx_t, int, va_list); extern fsckBlock_t fsckGetBlock(fsck_ctx_t, fsck_block_phase_t); extern void fsckSetBlock(fsck_ctx_t, fsck_block_phase_t, fsckBlock_t);