isync

mailbox synchronization program
git clone https://git.code.sf.net/p/isync/isync
Log | Files | Refs | README | LICENSE

commit 4eff48c54ed717a69d8cc3bb9c358ee440f46394
parent 08a375ea0736efa1c58af0c0b7a112f21b6a399a
Author: Oswald Buddenhagen <ossi@users.sf.net>
Date:   Tue, 12 Apr 2022 13:06:55 +0200

replace 1-t => t^1

this is consistent with what we already did for in-place operations.
arguably, it's also a bit more intuitive.

Diffstat:
Msrc/sync.c | 98++++++++++++++++++++++++++++++++++++++++----------------------------------------
1 file changed, 49 insertions(+), 49 deletions(-)

diff --git a/src/sync.c b/src/sync.c @@ -117,7 +117,7 @@ static void sync_deref( sync_vars_t *svars ); static int check_cancel( sync_vars_t *svars ); #define AUX &svars->t[t] -#define INV_AUX &svars->t[1-t] +#define INV_AUX &svars->t[t^1] #define DECL_SVARS \ int t; \ sync_vars_t *svars @@ -394,7 +394,7 @@ copy_msg_convert( int in_cr, int out_cr, copy_vars_t *vars, int t ) } } warn( "Warning: message %u from %s has incomplete header; skipping.\n", - vars->msg->uid, str_fn[1-t] ); + vars->msg->uid, str_fn[t^1] ); free( in_buf ); return 0; oke: @@ -438,7 +438,7 @@ copy_msg_convert( int in_cr, int out_cr, copy_vars_t *vars, int t ) vars->data.len = in_len + extra; if (vars->data.len > INT_MAX) { warn( "Warning: message %u from %s is too big after conversion; skipping.\n", - vars->msg->uid, str_fn[1-t] ); + vars->msg->uid, str_fn[t^1] ); free( in_buf ); return 0; } @@ -502,7 +502,7 @@ msg_fetched( int sts, void *aux ) vars->msg->flags = vars->data.flags = sanitize_flags( vars->data.flags, svars, t ); - scr = (svars->drv[1-t]->get_caps( svars->ctx[1-t] ) / DRV_CRLF) & 1; + scr = (svars->drv[t^1]->get_caps( svars->ctx[t^1] ) / DRV_CRLF) & 1; tcr = (svars->drv[t]->get_caps( svars->ctx[t] ) / DRV_CRLF) & 1; if (vars->srec || scr != tcr) { if (!copy_msg_convert( scr, tcr, vars, t )) { @@ -542,7 +542,7 @@ msg_stored( int sts, uint uid, void *aux ) INIT_SVARS(vars->aux); (void)svars; warn( "Warning: %s refuses to store message %u from %s.\n", - str_fn[t], vars->msg->uid, str_fn[1-t] ); + str_fn[t], vars->msg->uid, str_fn[t^1] ); vars->cb( SYNC_NOGOOD, 0, vars ); break; default: // DRV_BOX_BAD @@ -580,7 +580,7 @@ cancel_done( void *aux ) DECL_INIT_SVARS(aux); svars->state[t] |= ST_CANCELED; - if (svars->state[1-t] & ST_CANCELED) { + if (svars->state[t^1] & ST_CANCELED) { if (svars->nfp) { Fclose( svars->nfp, 0 ); Fclose( svars->jfp, 0 ); @@ -1191,13 +1191,13 @@ static void box_confirmed2( sync_vars_t *svars, int t ) { svars->state[t] |= ST_CONFIRMED; - if (!(svars->state[1-t] & ST_CONFIRMED)) + if (!(svars->state[t^1] & ST_CONFIRMED)) return; sync_ref( svars ); for (t = 0; ; t++) { if (!(svars->state[t] & ST_PRESENT)) { - if (!(svars->state[1-t] & ST_PRESENT)) { + if (!(svars->state[t^1] & ST_PRESENT)) { if (!svars->existing) { error( "Error: channel %s: both far side %s and near side %s cannot be opened.\n", svars->chan->name, svars->orig_name[F], svars->orig_name[N] ); @@ -1215,18 +1215,18 @@ box_confirmed2( sync_vars_t *svars, int t ) break; } if (svars->existing) { - if (!(svars->chan->ops[1-t] & OP_REMOVE)) { + if (!(svars->chan->ops[t^1] & OP_REMOVE)) { error( "Error: channel %s: %s box %s cannot be opened.\n", svars->chan->name, str_fn[t], svars->orig_name[t] ); goto bail; } - if (svars->drv[1-t]->confirm_box_empty( svars->ctx[1-t] ) != DRV_OK) { + if (svars->drv[t^1]->confirm_box_empty( svars->ctx[t^1] ) != DRV_OK) { warn( "Warning: channel %s: %s box %s cannot be opened and %s box %s is not empty.\n", - svars->chan->name, str_fn[t], svars->orig_name[t], str_fn[1-t], svars->orig_name[1-t] ); + svars->chan->name, str_fn[t], svars->orig_name[t], str_fn[t^1], svars->orig_name[t^1] ); goto done; } - info( "Deleting %s box %s...\n", str_fn[1-t], svars->orig_name[1-t] ); - svars->drv[1-t]->delete_box( svars->ctx[1-t], box_deleted, INV_AUX ); + info( "Deleting %s box %s...\n", str_fn[t^1], svars->orig_name[t^1] ); + svars->drv[t^1]->delete_box( svars->ctx[t^1], box_deleted, INV_AUX ); } else { if (!(svars->chan->ops[t] & OP_CREATE)) { box_opened( DRV_BOX_BAD, UIDVAL_BAD, AUX ); @@ -1302,7 +1302,7 @@ box_opened2( sync_vars_t *svars, int t ) uint opts[2], fails, minwuid; svars->state[t] |= ST_SELECTED; - if (!(svars->state[1-t] & ST_SELECTED)) + if (!(svars->state[t^1] & ST_SELECTED)) return; ctx[0] = svars->ctx[0]; ctx[1] = svars->ctx[1]; @@ -1331,23 +1331,23 @@ box_opened2( sync_vars_t *svars, int t ) for (t = 0; t < 2; t++) { if (chan->ops[t] & (OP_DELETE|OP_FLAGS)) { opts[t] |= OPEN_SETFLAGS; - opts[1-t] |= OPEN_OLD; + opts[t^1] |= OPEN_OLD; if (chan->ops[t] & OP_FLAGS) - opts[1-t] |= OPEN_FLAGS; + opts[t^1] |= OPEN_FLAGS; } if (chan->ops[t] & (OP_NEW|OP_RENEW)) { opts[t] |= OPEN_APPEND; if (chan->ops[t] & OP_NEW) { - opts[1-t] |= OPEN_NEW; + opts[t^1] |= OPEN_NEW; if (chan->stores[t]->max_size != UINT_MAX) - opts[1-t] |= OPEN_FLAGS|OPEN_NEW_SIZE; + opts[t^1] |= OPEN_FLAGS | OPEN_NEW_SIZE; } if (chan->ops[t] & OP_RENEW) { opts[t] |= OPEN_OLD|OPEN_FLAGS|OPEN_SETFLAGS; - opts[1-t] |= OPEN_OLD|OPEN_FLAGS; + opts[t^1] |= OPEN_OLD | OPEN_FLAGS; } if (chan->ops[t] & OP_EXPUNGE) // Don't propagate doomed msgs - opts[1-t] |= OPEN_FLAGS; + opts[t^1] |= OPEN_FLAGS; } if (chan->ops[t] & OP_EXPUNGE) { opts[t] |= OPEN_EXPUNGE; @@ -1355,7 +1355,7 @@ box_opened2( sync_vars_t *svars, int t ) if (!chan->stores[t]->trash_only_new) opts[t] |= OPEN_OLD; opts[t] |= OPEN_NEW|OPEN_FLAGS; - } else if (chan->stores[1-t]->trash && chan->stores[1-t]->trash_remote_new) { + } else if (chan->stores[t^1]->trash && chan->stores[t^1]->trash_remote_new) { opts[t] |= OPEN_NEW|OPEN_FLAGS; } } @@ -1386,7 +1386,7 @@ box_opened2( sync_vars_t *svars, int t ) if (srec->wstate & W_UPGRADE) { t = !srec->uid[F] ? F : N; opts[t] |= OPEN_APPEND; - opts[1-t] |= OPEN_OLD; + opts[t^1] |= OPEN_OLD; } } } @@ -1538,7 +1538,7 @@ box_loaded( int sts, message_t *msgs, int total_msgs, int recent_msgs, void *aux } free( srecmap ); - if (!(svars->state[1-t] & ST_LOADED)) + if (!(svars->state[t^1] & ST_LOADED)) return; for (t = 0; t < 2; t++) { @@ -1556,9 +1556,9 @@ box_loaded( int sts, message_t *msgs, int total_msgs, int recent_msgs, void *aux // Present paired messages require re-validation. if (!srec->msg[t]->msgid) continue; // Messages without ID are useless for re-validation. - if (!srec->msg[1-t]) + if (!srec->msg[t^1]) continue; // Partner disappeared. - if (!srec->msg[1-t]->msgid || strcmp( srec->msg[F]->msgid, srec->msg[N]->msgid )) { + if (!srec->msg[t^1]->msgid || strcmp( srec->msg[F]->msgid, srec->msg[N]->msgid )) { error( "Error: channel %s, %s box %s: UIDVALIDITY genuinely changed (at UID %u).\n", svars->chan->name, str_fn[t], svars->orig_name[t], srec->uid[t] ); uvchg: @@ -1636,7 +1636,7 @@ box_loaded( int sts, message_t *msgs, int total_msgs, int recent_msgs, void *aux // is nothing to update. // Note: the opposite UID must be valid, as otherwise the entry would // have been pruned already. - } else if (del[1-t]) { + } else if (del[t^1]) { // The source was newly expunged, so possibly propagate the deletion. // The target may be in an unknown state (not fetched). if ((t == F) && (srec->status & (S_EXPIRE|S_EXPIRED))) { @@ -1658,20 +1658,20 @@ box_loaded( int sts, message_t *msgs, int total_msgs, int recent_msgs, void *aux debug( " not %sing delete\n", str_hl[t] ); } } - } else if (!srec->msg[1-t]) { + } else if (!srec->msg[t^1]) { // We have no source to work with, because it was never stored, // it was previously expunged, or we did not fetch it. - debug( " no %s\n", str_fn[1-t] ); + debug( " no %s\n", str_fn[t^1] ); } else { // We have a source. The target may be in an unknown state. if (svars->chan->ops[t] & OP_FLAGS) { - sflags = sanitize_flags( srec->msg[1-t]->flags, svars, t ); + sflags = sanitize_flags( srec->msg[t^1]->flags, svars, t ); if ((t == F) && (srec->status & (S_EXPIRE|S_EXPIRED))) { /* Don't propagate deletion resulting from expiration. */ debug( " near side expiring\n" ); sflags &= ~F_DELETED; } - if (srec->status & S_DUMMY(1-t)) { + if (srec->status & S_DUMMY(t^1)) { // For placeholders, don't propagate: // - Seen, because the real contents were obviously not seen yet // - Flagged, because it's just a request to upgrade @@ -1710,7 +1710,7 @@ box_loaded( int sts, message_t *msgs, int total_msgs, int recent_msgs, void *aux // This is separated, because the upgrade can come from the journal. if (srec->wstate & W_UPGRADE) { t = !srec->uid[F] ? F : N; - tmsg = srec->msg[1-t]; + tmsg = srec->msg[t^1]; if ((svars->chan->ops[t] & OP_EXPUNGE) && (srec->pflags & F_DELETED)) { JLOG( "- %u %u", (srec->uid[F], srec->uid[N]), "killing upgrade - would be expunged anyway" ); tmsg->srec = NULL; @@ -1727,15 +1727,15 @@ box_loaded( int sts, message_t *msgs, int total_msgs, int recent_msgs, void *aux } for (t = 0; t < 2; t++) { - debug( "synchronizing new messages on %s\n", str_fn[1-t] ); - for (tmsg = svars->msgs[1-t]; tmsg; tmsg = tmsg->next) { + debug( "synchronizing new messages on %s\n", str_fn[t^1] ); + for (tmsg = svars->msgs[t^1]; tmsg; tmsg = tmsg->next) { srec = tmsg->srec; if (srec) { if (srec->status & S_SKIPPED) { // Pre-1.4 legacy only: The message was skipped due to being too big. // We must have already seen the UID, but we might have been interrupted. - if (svars->maxuid[1-t] < tmsg->uid) - svars->maxuid[1-t] = tmsg->uid; + if (svars->maxuid[t^1] < tmsg->uid) + svars->maxuid[t^1] = tmsg->uid; if (!(svars->chan->ops[t] & OP_RENEW)) continue; srec->status = S_PENDING; @@ -1755,8 +1755,8 @@ box_loaded( int sts, message_t *msgs, int total_msgs, int recent_msgs, void *aux // - whose propagation was completed, but not logged yet // - that aren't actually new, but a result of syncing, and the instant // maxuid upping was prevented by the presence of actually new messages - if (svars->maxuid[1-t] < tmsg->uid) - svars->maxuid[1-t] = tmsg->uid; + if (svars->maxuid[t^1] < tmsg->uid) + svars->maxuid[t^1] = tmsg->uid; if (!(srec->status & S_PENDING)) continue; // Nothing to do - the message is paired or expired // Propagation was scheduled, but we got interrupted @@ -1772,14 +1772,14 @@ box_loaded( int sts, message_t *msgs, int total_msgs, int recent_msgs, void *aux } else { if (!(svars->chan->ops[t] & OP_NEW)) continue; - if (tmsg->uid <= svars->maxuid[1-t]) { + if (tmsg->uid <= svars->maxuid[t^1]) { // The message should be already paired. It's not, so it was: // - previously paired, but the entry was expired and pruned => ignore // - attempted, but failed => ignore (the wisdom of this is debatable) // - ignored, as it would have been expunged anyway => ignore (even if undeleted) continue; } - svars->maxuid[1-t] = tmsg->uid; + svars->maxuid[t^1] = tmsg->uid; debug( "new message %u\n", tmsg->uid ); if ((svars->chan->ops[t] & OP_EXPUNGE) && (tmsg->flags & F_DELETED)) { @@ -1792,8 +1792,8 @@ box_loaded( int sts, message_t *msgs, int total_msgs, int recent_msgs, void *aux svars->srecadd = &srec->next; svars->nsrecs++; srec->status = S_PENDING; - srec->uid[1-t] = tmsg->uid; - srec->msg[1-t] = tmsg; + srec->uid[t^1] = tmsg->uid; + srec->msg[t^1] = tmsg; tmsg->srec = srec; JLOG( "+ %u %u", (srec->uid[F], srec->uid[N]), "fresh" ); } @@ -1993,7 +1993,7 @@ box_loaded( int sts, message_t *msgs, int total_msgs, int recent_msgs, void *aux // fsync'ing the UIDNEXT bump is not strictly necessary, but advantageous. svars->finduid[t] = svars->drv[t]->get_uidnext( svars->ctx[t] ); JLOG( "F %d %u", (t, svars->finduid[t]), "save UIDNEXT of %s", str_fn[t] ); - svars->new_msgs[t] = svars->msgs[1-t]; + svars->new_msgs[t] = svars->msgs[t^1]; } else { svars->state[t] |= ST_SENT_NEW; } @@ -2096,7 +2096,7 @@ msgs_copied( sync_vars_t *svars, int t ) if (svars->new_pending[t]) goto out; - sync_close( svars, 1-t ); + sync_close( svars, t^1 ); if (check_cancel( svars )) goto out; @@ -2155,7 +2155,7 @@ flags_set_p2( sync_vars_t *svars, sync_rec_t *srec, int t ) { if (srec->wstate & W_DELETE) { JLOG( "%c %u %u 0", ("><"[t], srec->uid[F], srec->uid[N]), "%sed deletion", str_hl[t] ); - srec->uid[1-t] = 0; + srec->uid[t^1] = 0; } else { uchar nflags = (srec->flags | srec->aflags[t]) & ~srec->dflags[t]; if (srec->flags != nflags) { @@ -2196,7 +2196,7 @@ msgs_flags_set( sync_vars_t *svars, int t ) sync_ref( svars ); if ((svars->chan->ops[t] & OP_EXPUNGE) && - (svars->ctx[t]->conf->trash || (svars->ctx[1-t]->conf->trash && svars->ctx[1-t]->conf->trash_remote_new))) { + (svars->ctx[t]->conf->trash || (svars->ctx[t^1]->conf->trash && svars->ctx[t^1]->conf->trash_remote_new))) { debug( "trashing on %s\n", str_fn[t] ); for (tmsg = svars->msgs[t]; tmsg; tmsg = tmsg->next) { if ((tmsg->flags & F_DELETED) && !find_uint_array( svars->trashed_msgs[t].array, tmsg->uid ) && @@ -2218,7 +2218,7 @@ msgs_flags_set( sync_vars_t *svars, int t ) } } else { if (!tmsg->srec || (tmsg->srec->status & (S_PENDING | S_SKIPPED))) { - if (tmsg->size <= svars->ctx[1-t]->conf->max_size) { + if (tmsg->size <= svars->ctx[t^1]->conf->max_size) { debug( "%s: remote trashing message %u\n", str_fn[t], tmsg->uid ); trash_total[t]++; stats(); @@ -2282,7 +2282,7 @@ msg_rtrashed( int sts, uint uid ATTR_UNUSED, copy_vars_t *vars ) return; } t ^= 1; - JLOG( "T %d %u", (t, vars->msg->uid), "trashed remotely on %s", str_fn[1-t] ); + JLOG( "T %d %u", (t, vars->msg->uid), "trashed remotely on %s", str_fn[t^1] ); free( vars ); trash_done[t]++; stats(); @@ -2297,7 +2297,7 @@ static void sync_close( sync_vars_t *svars, int t ) { if ((~svars->state[t] & (ST_FOUND_NEW|ST_SENT_TRASH)) || svars->trash_pending[t] || - !(svars->state[1-t] & ST_SENT_NEW) || svars->new_pending[1-t]) + !(svars->state[t^1] & ST_SENT_NEW) || svars->new_pending[t^1]) return; if (svars->state[t] & ST_CLOSING) @@ -2326,7 +2326,7 @@ box_closed_p2( sync_vars_t *svars, int t ) sync_rec_t *srec; svars->state[t] |= ST_CLOSED; - if (!(svars->state[1-t] & ST_CLOSED)) + if (!(svars->state[t^1] & ST_CLOSED)) return; // All the journalling done in this function is merely for the autotest -