File ‹list_reverse.c›
/*
* Copyright 2020, Data61, CSIRO (ABN 41 687 119 230)
* Copyright (c) 2022 Apple Inc. All rights reserved.
*
* SPDX-License-Identifier: BSD-2-Clause
*/
typedef unsigned long word_t;
/** FNSPEC reverse_spec:
"Γ ⊢
⦃ (list zs ´i)⇗sep⇖ ⦄
´ret' :== PROC reverse(´i)
⦃ (list (rev zs) (Ptr (scast ´ret')))⇗sep⇖ ⦄"
*/
long reverse(word_t *i)
{
word_t j = 0;
while (i)
/** INV: "⦃ ∃xs ys. (list xs ´i ∧⇧* list ys (Ptr ´j))⇗sep⇖ ∧ rev zs = (rev xs)@ys ⦄" */
{
word_t *k = (word_t*)*i;
*i = j;
j = (word_t)i;
i = k;
}
return j;
}