summaryrefslogtreecommitdiff
path: root/lapi.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2014-05-14 11:20:17 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2014-05-14 11:20:17 -0300
commit965993da071ff38f14ec49f42ef989d66d717c64 (patch)
treeac32a96cff9d95cfce8fb22b1cf8861a85a73944 /lapi.c
parent5a5a834975d135054e803b90711fcb9deb6511b8 (diff)
downloadlua-965993da071ff38f14ec49f42ef989d66d717c64.tar.gz
lua-965993da071ff38f14ec49f42ef989d66d717c64.tar.bz2
lua-965993da071ff38f14ec49f42ef989d66d717c64.zip
comments added to 'lua_rotate'
Diffstat (limited to 'lapi.c')
-rw-r--r--lapi.c18
1 files changed, 11 insertions, 7 deletions
diff --git a/lapi.c b/lapi.c
index 0fdb6bed..319d1c68 100644
--- a/lapi.c
+++ b/lapi.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lapi.c,v 2.209 2014/05/01 18:21:32 roberto Exp roberto $ 2** $Id: lapi.c,v 2.210 2014/05/13 19:40:28 roberto Exp roberto $
3** Lua API 3** Lua API
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -195,17 +195,21 @@ static void reverse (lua_State *L, StkId from, StkId to) {
195} 195}
196 196
197 197
198/*
199** Let x = AB, where A is a prefix of length 'n'. Then,
200** rotate x n == BA. But BA == (A^r . B^r)^r.
201*/
198LUA_API void lua_rotate (lua_State *L, int idx, int n) { 202LUA_API void lua_rotate (lua_State *L, int idx, int n) {
199 StkId p, t, m; 203 StkId p, t, m;
200 lua_lock(L); 204 lua_lock(L);
201 t = L->top - 1; 205 t = L->top - 1; /* end of stack segment being rotated */
202 p = index2addr(L, idx); 206 p = index2addr(L, idx); /* start of segment */
203 m = (n >= 0 ? t - n : p - n - 1); 207 m = (n >= 0 ? t - n : p - n - 1); /* end of prefix */
204 api_checkstackindex(L, idx, p); 208 api_checkstackindex(L, idx, p);
205 api_check(L, p <= m + 1 && m <= t, "invalid 'n'"); 209 api_check(L, p <= m + 1 && m <= t, "invalid 'n'");
206 reverse(L, p, m); 210 reverse(L, p, m); /* reverse the prefix with length 'n' */
207 reverse(L, m + 1, t); 211 reverse(L, m + 1, t); /* reverse the suffix */
208 reverse(L, p, t); 212 reverse(L, p, t); /* reverse the entire segment */
209 lua_unlock(L); 213 lua_unlock(L);
210} 214}
211 215