diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2014-05-14 11:20:17 -0300 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2014-05-14 11:20:17 -0300 |
| commit | 965993da071ff38f14ec49f42ef989d66d717c64 (patch) | |
| tree | ac32a96cff9d95cfce8fb22b1cf8861a85a73944 | |
| parent | 5a5a834975d135054e803b90711fcb9deb6511b8 (diff) | |
| download | lua-965993da071ff38f14ec49f42ef989d66d717c64.tar.gz lua-965993da071ff38f14ec49f42ef989d66d717c64.tar.bz2 lua-965993da071ff38f14ec49f42ef989d66d717c64.zip | |
comments added to 'lua_rotate'
| -rw-r--r-- | lapi.c | 18 |
1 files changed, 11 insertions, 7 deletions
| @@ -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 | */ | ||
| 198 | LUA_API void lua_rotate (lua_State *L, int idx, int n) { | 202 | LUA_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 | ||
