X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Faction%2Fassembler.c;fp=lib%2Faction%2Fassembler.c;h=8526e99905fdc866f84e95b577bdc12ab1a465b6;hb=628e5b0c1264d8419cde6e458d09ed266bb1c79d;hp=0000000000000000000000000000000000000000;hpb=4cc2227e383358d13c984a7cfa6e7a920450cf16;p=swftools.git diff --git a/lib/action/assembler.c b/lib/action/assembler.c new file mode 100644 index 0000000..8526e99 --- /dev/null +++ b/lib/action/assembler.c @@ -0,0 +1,131 @@ +/* + Ming, an SWF output library + Copyright (C) 2002 Opaque Industries - http://www.opaque.net/ + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include +#include +#include +#include "assembler.h" +#include "compile.h" +#include "action.h" + + +int len; +Buffer asmBuffer; +int nLabels; + +struct label +{ + char *name; + int offset; +}; + +struct label labels[256]; + + +static int +findLabel(char *label) +{ + int i; + + for ( i=0; ibuffer; + + while ( i < len ) + { + if ( output[i] & 0x80 ) /* then it's a multibyte instruction */ + { + if ( output[i] == SWFACTION_BRANCHALWAYS || + output[i] == SWFACTION_BRANCHIFTRUE ) + { + int target, offset; + + i += 3; /* plus instruction plus two-byte length */ + + target = output[i]; + offset = labels[target].offset - (i+2); + output[i] = offset & 0xff; + output[++i] = (offset>>8) & 0xff; + ++i; + } + else + { + ++i; + l = output[i]; + ++i; + l += output[i]<<8; + + i += l+1; + } + } + else + ++i; + } +} + + +/* + * Local variables: + * tab-width: 2 + * c-basic-offset: 2 + * End: + */