version 1.18, 2007/12/31 18:40:24
|
version 1.22, 2011/08/19 17:58:20
|
Line 1
|
Line 1
|
\ source location handling |
\ source location handling |
|
|
\ Copyright (C) 1995,1997,2003,2004 Free Software Foundation, Inc. |
\ Copyright (C) 1995,1997,2003,2004,2007,2009 Free Software Foundation, Inc. |
|
|
\ This file is part of Gforth. |
\ This file is part of Gforth. |
|
|
Line 31
|
Line 31
|
rdrop 2drop i unloop exit |
rdrop 2drop i unloop exit |
endif |
endif |
r> loop |
r> loop |
drop 2drop 0 ; |
drop 2drop -1 ; |
|
|
: current-sourcepos ( -- nfile nline ) |
\ we encode line and character in one cell to keep the interface the same |
sourcefilename str>loadfilename# sourceline# ; |
: encode-pos ( nline nchar -- npos ) |
|
$ff min swap 8 lshift + ; |
|
|
: compile-sourcepos ( compile-time: -- ; run-time: -- nfile nline ) |
: decode-pos ( npos -- nline nchar ) |
|
dup 8 rshift swap $ff and ; |
|
|
|
: current-sourcepos ( -- nfile npos ) |
|
sourcefilename str>loadfilename# sourceline# >in @ encode-pos ; |
|
|
|
: compile-sourcepos ( compile-time: -- ; run-time: -- nfile npos ) |
\ compile the current source position as literals: nfile is the |
\ compile the current source position as literals: nfile is the |
\ source file index, nline the line number within the file. |
\ source file index, nline the line number within the file. |
current-sourcepos swap postpone literal postpone literal ; |
current-sourcepos |
|
swap postpone literal |
|
postpone literal ; |
|
|
: .sourcepos ( nfile nline -- ) |
: .sourcepos ( nfile npos -- ) |
\ print source position |
\ print source position |
swap loadfilename#>str type ." :" |
swap loadfilename#>str type ': emit |
base @ decimal swap 0 .r base ! ; |
base @ decimal |
|
swap decode-pos swap 0 .r ': emit 0 .r |
|
base ! ; |
|
|
|
: save-source-filename ( c-addr1 u1 -- c-addr2 u2 ) |
|
\ c-addr1 u1 is a temporary string for a file name, c-addr2 u2 is |
|
\ a permanent one. Reuses strings for the same file names and |
|
\ adds them to the included files (not sure if that's a good idea) |
|
2dup str>loadfilename# dup 0< if |
|
drop save-mem 2dup add-included-file |
|
else |
|
nip nip loadfilename#>str |
|
then ; |
|
|
|
: #line ( "u" "["file"]" -- ) |
|
\g Set the line number to @i{u} and (if present) the file name to @i{file}. Consumes the rest of the line. |
|
\g |
|
parse-name ['] evaluate 10 base-execute 1- loadline ! |
|
'"' parse 2drop '"' parse dup if |
|
save-source-filename loadfilename 2! |
|
else |
|
2drop |
|
then |
|
postpone \ ; |