Part of the swftools package.
Copyright (c) 2001 Matthias Kramm <kramm@quiss.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program 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 General Public License for more details.
- This file is distributed under the GPL, see file COPYING for details */
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <memory.h>
#include <errno.h>
-#define logf logarithmf // logf is also used by ../lib/log.h
#include <math.h>
-#undef logf
#include "../config.h"
#include "../lib/rfxswf.h"
#include "../lib/log.h"
#include "../lib/args.h"
-#include "q.h"
+#include "../lib/q.h"
#include "parser.h"
+#include "wav.h"
//#define DEBUG
int oldframe;
dictionary_t oldinstances;
SRECT oldrect;
+ TAG* cut;
} stack[256];
static int stackpos = 0;
static dictionary_t characters;
+static dictionary_t images;
static char idmap[65536];
static TAG*tag = 0; //current tag
static U16 currentdepth;
static dictionary_t instances;
static dictionary_t fonts;
+static dictionary_t sounds;
typedef struct _parameters {
int x,y;
swf_SetU16(tag, id);
swf_SetString(tag, name);
}
+static void s_addimage(char*name, U16 id, TAG*ctag, SRECT r)
+{
+ character_t* c = character_new();
+ c->definingTag = ctag;
+ c->id = id;
+ c->size = r;
+
+ if(dictionary_lookup(&images, name))
+ syntaxerror("image %s defined twice", name);
+ dictionary_put2(&images, name, c);
+}
static instance_t* s_addinstance(char*name, character_t*c, U16 depth)
{
instance_t* i = instance_new();
return m;
}
-void s_swf(char*name, SRECT r, int version, int fps, int compress)
+void s_swf(char*name, SRECT r, int version, int fps, int compress, RGBA background)
{
SWF*swf = (SWF*)malloc(sizeof(SWF));
- RGBA rgb;
if(stackpos)
syntaxerror(".swf blocks can't be nested");
swf->frameRate = fps;
swf->firstTag = tag = swf_InsertTag(0, ST_SETBACKGROUNDCOLOR);
swf->compressed = compress;
- rgb.r = 0x00;rgb.g = 0x00;rgb.b = 0x00;
- swf_SetRGB(tag,&rgb);
+ swf_SetRGB(tag,&background);
if(stackpos==sizeof(stack)/sizeof(stack[0]))
syntaxerror("too many levels of recursion");
dictionary_init(&characters);
+ dictionary_init(&images);
dictionary_init(&instances);
dictionary_init(&fonts);
+ dictionary_init(&sounds);
memset(&stack[stackpos], 0, sizeof(stack[0]));
stack[stackpos].type = 0;
incrementid();
}
+TAG* removeFromTo(TAG*from, TAG*to)
+{
+ TAG*save = from->prev;
+ while(from!=to) {
+ TAG*next = from->next;
+ swf_DeleteTag(from);
+ from = next;
+ }
+ save->next = 0;
+ return save;
+}
+
static void s_endSprite()
{
SRECT r = currentrect;
+
+ if(stack[stackpos].cut)
+ tag = removeFromTo(stack[stackpos].cut, tag);
+
stackpos--;
/* TODO: before clearing, prepend "<spritename>." to names and
currentrect = stack[stackpos].oldrect;
currentdepth = stack[stackpos].olddepth;
instances = stack[stackpos].oldinstances;
+
tag = swf_InsertTag(tag, ST_END);
tag = stack[stackpos].tag;
int fi;
SWF* swf;
char*filename;
+
+ if(stack[stackpos].cut)
+ tag = removeFromTo(stack[stackpos].cut, tag);
+
stackpos--;
swf = stack[stackpos].swf;
filename = stack[stackpos].filename;
-
- tag = swf_InsertTag(tag, ST_SHOWFRAME);
+
+ //tag = swf_InsertTag(tag, ST_SHOWFRAME); //?
+
tag = swf_InsertTag(tag, ST_END);
swf_OptimizeTagOrder(swf);
if(!(swf->movieSize.xmax-swf->movieSize.xmin) || !(swf->movieSize.ymax-swf->movieSize.ymin))
swf->movieSize = currentrect; /* "autocrop" */
+
+ if(!(swf->movieSize.xmax-swf->movieSize.xmin) || !(swf->movieSize.ymax-swf->movieSize.ymin)) {
+ swf->movieSize.xmax += 20; /* 1 by 1 pixels */
+ swf->movieSize.ymax += 20;
+ }
- fi = open(filename, O_WRONLY|O_CREAT|O_TRUNC, 0644);
+ fi = open(filename, O_WRONLY|O_CREAT|O_TRUNC|O_BINARY, 0644);
if(fi<0) {
syntaxerror("couldn't create output file %s", filename);
}
dictionary_clear(&instances);
dictionary_clear(&characters);
+ dictionary_clear(&images);
dictionary_clear(&fonts);
+ dictionary_clear(&sounds);
swf_FreeTags(swf);
free(swf);
free(filename);
}
+
void s_close()
{
if(stackpos) {
return currentframe;
}
-void s_frame(int nr)
+void s_frame(int nr, int cut)
{
int t;
+ TAG*now = tag;
+
for(t=currentframe;t<nr;t++) {
tag = swf_InsertTag(tag, ST_SHOWFRAME);
}
+
+ if(cut) {
+ if(now == tag) {
+ syntaxerror("Can't cut, frame empty");
+ }
+ stack[stackpos].cut = tag;
+ }
+
currentframe = nr;
}
+
+int parseColor2(char*str, RGBA*color);
+
+int addFillStyle(SHAPE*s, SRECT*r, char*texture)
+{
+ RGBA color;
+ character_t*image;
+ if(texture[0] == '#') {
+ parseColor2(texture, &color);
+ return swf_ShapeAddSolidFillStyle(s, &color);
+ } else if((image = dictionary_lookup(&images, texture))) {
+ MATRIX m;
+ swf_GetMatrix(0, &m);
+ m.sx = 65536.0*20.0*(r->xmax - r->xmin)/image->size.xmax;
+ m.sy = 65536.0*20.0*(r->ymax - r->ymin)/image->size.ymax;
+ m.tx = r->xmin;
+ m.ty = r->ymin;
+ return swf_ShapeAddBitmapFillStyle(s, &m, image->id, 0);
+ } /*else if ((texture = dictionary_lookup(&textures, texture))) {
+ } else if ((gradient = dictionary_lookup(&gradients, texture))) {
+ } */ else if (parseColor2(texture, &color)) {
+ return swf_ShapeAddSolidFillStyle(s, &color);
+ } else {
+ syntaxerror("not a color/fillstyle: %s", texture);
+ return 0;
+ }
+}
RGBA black={r:0,g:0,b:0,a:0};
-void s_box(char*name, int width, int height, RGBA color, int linewidth, RGBA fill, int dofill)
+void s_box(char*name, int width, int height, RGBA color, int linewidth, char*texture)
{
- SRECT r;
+ SRECT r,r2;
SHAPE* s;
int ls1,fs1=0;
+ r2.xmin = 0;
+ r2.ymin = 0;
+ r2.xmax = width;
+ r2.ymax = height;
tag = swf_InsertTag(tag, ST_DEFINESHAPE);
swf_ShapeNew(&s);
ls1 = swf_ShapeAddLineStyle(s,linewidth,&color);
- if(dofill)
- fs1 = swf_ShapeAddSolidFillStyle(s,&fill);
+
+ if(texture)
+ fs1 = addFillStyle(s, &r2, texture);
+
swf_SetU16(tag,id);
- r.xmin = -linewidth-linewidth/2;
- r.ymin = -linewidth-linewidth/2;
- r.xmax = width+linewidth+linewidth/2;
- r.ymax = height+linewidth+linewidth/2;
+ r.xmin = r2.xmin-linewidth-linewidth/2;
+ r.ymin = r2.ymin-linewidth-linewidth/2;
+ r.xmax = r2.xmax+linewidth+linewidth/2;
+ r.ymax = r2.ymax+linewidth+linewidth/2;
swf_SetRect(tag,&r);
swf_SetShapeHeader(tag,s);
swf_ShapeSetAll(tag,s,0,0,ls1,fs1,0);
incrementid();
}
-void s_circle(char*name, int r, RGBA color, int linewidth, RGBA fill, int dofill)
+void s_circle(char*name, int r, RGBA color, int linewidth, char*texture)
{
- SRECT rect;
+ SRECT rect,r2;
SHAPE* s;
int ls1,fs1=0;
+ r2.xmin = r2.ymin = 0;
+ r2.xmax = 2*r;
+ r2.ymax = 2*r;
+
tag = swf_InsertTag(tag, ST_DEFINESHAPE);
swf_ShapeNew(&s);
ls1 = swf_ShapeAddLineStyle(s,linewidth,&color);
- if(dofill)
- fs1 = swf_ShapeAddSolidFillStyle(s,&fill);
+ if(texture)
+ fs1 = addFillStyle(s, &r2, texture);
swf_SetU16(tag,id);
- rect.xmin = -linewidth-linewidth/2;
- rect.ymin = -linewidth-linewidth/2;
- rect.xmax = 2*r+linewidth+linewidth/2;
- rect.ymax = 2*r+linewidth+linewidth/2;
+ rect.xmin = r2.xmin-linewidth-linewidth/2;
+ rect.ymin = r2.ymin-linewidth-linewidth/2;
+ rect.xmax = r2.xmax+linewidth+linewidth/2;
+ rect.ymax = r2.ymax+linewidth+linewidth/2;
swf_SetRect(tag,&rect);
swf_SetShapeHeader(tag,s);
incrementid();
}
-void s_textshape(char*name, char*fontname, char*_text, RGBA color, int linewidth, RGBA fill, int dofill)
+void s_textshape(char*name, char*fontname, char*_text, RGBA color, int linewidth, char*texture)
{
- SRECT rect;
+ SRECT rect,r2;
SHAPE* s;
int ls1,fs1=0;
int g;
font = dictionary_lookup(&fonts, fontname);
if(!font)
syntaxerror("font \"%s\" not known!", fontname);
- if(!dofill)
+
+ if(!texture)
+ /* the shape information we have implies exactly one fill style
+ This means to support outlines we'd have to rework the whole shape.
+ */
syntaxerror("textshapes must be filled", fontname);
+ /* TODO: supporting more than once character would be nice... */
+
if(text[0] >= font->maxascii || font->ascii2glyph[text[0]]<0) {
warning("no character 0x%02x (%c) in font \"%s\"", text[0], text[0], fontname);
- s_box(name, 0, 0, black, 20, black, 0);
+ s_box(name, 0, 0, black, 20, 0);
return;
}
g = font->ascii2glyph[text[0]];
swf_ShapeNew(&s);
ls1 = swf_ShapeAddLineStyle(s,linewidth,&color);
- if(dofill)
- fs1 = swf_ShapeAddSolidFillStyle(s,&fill);
+ if(texture)
+ fs1 = addFillStyle(s, &rect, texture);
+
+ rect.xmin -= linewidth + linewidth/2;
+ rect.ymin -= linewidth + linewidth/2;
+ rect.xmin += linewidth + linewidth/2;
+ rect.ymin += linewidth + linewidth/2;
tag = swf_InsertTag(tag, ST_DEFINESHAPE);
swf_SetU16(tag,id);
s_addcharacter(name, id, tag, rect);
incrementid();
}
+
void s_text(char*name, char*fontname, char*text, int size, RGBA color)
{
SRECT r;
tag = swf_InsertTag(tag, ST_DEFINETEXT2);
swf_SetU16(tag, id);
if(!font->numchars) {
- s_box(name, 0, 0, black, 20, black, 0);
+ s_box(name, 0, 0, black, 20, 0);
return;
}
r = swf_SetDefineText(tag, font, &color, text, size);
incrementid();
}
+/* type: either "jpeg" or "png"
+ */
+void s_image(char*name, char*type, char*filename, int quality)
+{
+ /* an image is actually two folded: 1st bitmap, 2nd character.
+ Both of them can be used separately */
+
+ /* step 1: the bitmap */
+ SRECT r;
+ int imageID = id;
+ int width, height;
+ if(type=="png") {
+ warning("image type \"png\" not supported yet!");
+ s_box(name, 0, 0, black, 20, 0);
+ return;
+ }
+ tag = swf_InsertTag(tag, ST_DEFINEBITSJPEG2);
+ swf_SetU16(tag, imageID);
+
+ if(swf_SetJPEGBits(tag, filename, quality) < 0) {
+ syntaxerror("Image \"%s\" not found, or contains errors", filename);
+ }
+
+ swf_GetJPEGSize(filename, &width, &height);
+
+ r.xmin = 0;
+ r.ymin = 0;
+ r.xmax = width*20;
+ r.ymax = height*20;
+
+ s_addimage(name, id, tag, r);
+ incrementid();
+
+ /* step 2: the character */
+ tag = swf_InsertTag(tag, ST_DEFINESHAPE); // todo: should be defineshape2/3 once images can be transparent.(?)
+ swf_SetU16(tag, id);
+ swf_ShapeSetBitmapRect(tag, imageID, width, height);
+
+ s_addcharacter(name, id, tag, r);
+ incrementid();
+}
+
void dumpSWF(SWF*swf)
{
TAG* tag = swf->firstTag;
int f;
SWF swf;
SWFFONT* font;
- f = open(filename,O_RDONLY);
+ f = open(filename,O_RDONLY|O_BINARY);
if (f<0) {
warning("Couldn't open file \"%s\": %s", filename, strerror(errno));
font = (SWFFONT*)malloc(sizeof(SWFFONT));
dictionary_put2(&fonts, name, font);
}
-void s_shape(char*name, char*filename)
+typedef struct _sound_t
+{
+ U16 id;
+ TAG*tag;
+} sound_t;
+
+void s_sound(char*name, char*filename)
+{
+ struct WAV wav, wav2;
+ sound_t* sound;
+ U16*samples;
+ int numsamples;
+
+ if(!readWAV(filename, &wav)) {
+ warning("Couldn't read wav file \"%s\"", filename);
+ samples = 0;
+ numsamples = 0;
+ } else {
+ convertWAV2mono(&wav, &wav2, 44100);
+ samples = (U16*)wav2.data;
+ numsamples = wav2.size/2;
+ free(wav.data);
+ }
+
+ tag = swf_InsertTag(tag, ST_DEFINESOUND);
+ swf_SetU16(tag, id); //id
+ swf_SetSoundDefine(tag, samples, numsamples);
+
+ sound = (sound_t*)malloc(sizeof(sound_t)); /* mem leak */
+ sound->tag = tag;
+ sound->id = id;
+
+ if(dictionary_lookup(&sounds, name))
+ syntaxerror("sound %s defined twice", name);
+ dictionary_put2(&sounds, name, sound);
+
+ incrementid();
+
+ if(samples)
+ free(samples);
+}
+
+void s_playsound(char*name, int loops, int nomultiple, int stop)
+{
+ sound_t* sound = dictionary_lookup(&sounds, name);
+ SOUNDINFO info;
+ if(!sound)
+ syntaxerror("Don't know anything about sound \"%s\"", name);
+
+ tag = swf_InsertTag(tag, ST_STARTSOUND);
+ swf_SetU16(tag, sound->id); //id
+ memset(&info, 0, sizeof(info));
+ info.stop = stop;
+ info.loops = loops;
+ info.nomultiple = nomultiple;
+ swf_SetSoundInfo(tag, &info);
+}
+
+void s_includeswf(char*name, char*filename)
{
int f;
SWF swf;
f = open(filename,O_RDONLY);
if (f<0) {
warning("Couldn't open file \"%s\": %s", filename, strerror(errno));
- s_box(name, 0, 0, black, 20, black, 0);
+ s_box(name, 0, 0, black, 20, 0);
return;
}
if (swf_ReadSWF(f,&swf)<0) {
warning("Only SWF files supported in .shape for now. File \"%s\" wasn't SWF.", filename);
- s_box(name, 0, 0, black, 20, black, 0);
+ s_box(name, 0, 0, black, 20, 0);
return;
}
close(f);
}
int parseTwip(char*str)
{
- char*dot = strchr(str, '.');
+ char*dot;
+ int sign=1;
+ if(str[0]=='+' || str[0]=='-') {
+ if(str[0]=='-')
+ sign = -1;
+ str++;
+ }
+ dot = strchr(str, '.');
if(!dot) {
int l=strlen(str);
int t;
- return parseInt(str)*20;
+ return sign*parseInt(str)*20;
} else {
int l=strlen(++dot);
char*s;
l=2;
}
if(l==0)
- return atoi(str)*20;
+ return sign*atoi(str)*20;
if(l==1)
- return atoi(str)*20+atoi(dot)*2;
+ return sign*atoi(str)*20+atoi(dot)*2;
if(l==2)
- return atoi(str)*20+atoi(dot)/5;
+ return sign*atoi(str)*20+atoi(dot)/5;
}
return 0;
}
{
char* value = map_lookup(args, name);
if(!value) {
+ map_dump(args, stdout, "");
syntaxerror("internal error 2: value %s should be set", name);
}
return value;
}
-static int c_swf(map_t*args)
+static int c_flash(map_t*args)
{
char* name = lu(args, "name");
char* compressstr = lu(args, "compress");
int version = parseInt(lu(args, "version"));
int fps = (int)(parseFloat(lu(args, "fps"))*256);
int compress = 0;
+ RGBA color = parseColor(lu(args, "background"));
if(!strcmp(name, "!default!") || override_outputname)
name = outputname;
compress = 0;
else syntaxerror("value \"%s\" not supported for the compress argument", compressstr);
- s_swf(name, bbox, version, fps, compress);
+ s_swf(name, bbox, version, fps, compress, color);
return 0;
}
int isRelative(char*str)
l--;
return *(SPOINT*)&mpoints.buffer[l];
}
+static int c_gradient(map_t*args)
+{
+ return 0;
+}
static int c_point(map_t*args)
{
char*name = lu(args, "name");
dictionary_put(&points, s1, (void*)pos);
return 0;
}
+static int c_play(map_t*args)
+{
+ char*name = lu(args, "sound");
+ char*loop = lu(args, "loop");
+ char*nomultiple = lu(args, "nomultiple");
+ int nm = 0;
+ if(!strcmp(nomultiple, "nomultiple"))
+ nm = 1;
+ else
+ nm = parseInt(nomultiple);
+
+ s_playsound(name, parseInt(loop), nm, 0);
+ return 0;
+}
+
+static int c_stop(map_t*args)
+{
+ char*name = lu(args, "sound");
+ s_playsound(name, 0,0,1);
+ return 0;
+}
+
static int c_placement(map_t*args, int type)
{
char*instance = lu(args, (type==0||type==4)?"instance":"name");
static int c_frame(map_t*args)
{
char*framestr = lu(args, "n");
+ char*cutstr = lu(args, "cut");
int frame;
+ int cut = 0;
+ if(strcmp(cutstr, "no"))
+ cut = 1;
if(isRelative(framestr)) {
frame = s_getframe();
if(getSign(framestr)<0)
&& !(frame==0 && s_getframe()==frame)) // equality is o.k. for frame 0
syntaxerror("frame expression must be >%d (is:%s)", s_getframe(), framestr);
}
- s_frame(frame);
+ s_frame(frame, cut);
return 0;
}
static int c_primitive(map_t*args)
if(!strcmp(fillstr, "fill"))
fillstr = colorstr;
if(!strcmp(fillstr, "none"))
- dofill = 0;
+ fillstr = 0;
if(width<0 || height<0 || linewidth<0 || r<0)
syntaxerror("values width, height, line, r must be positive");
- if(!dofill || isColor(fillstr)) {
- if(dofill)
- fill = parseColor(fillstr);
- } else {
- /* FIXME - texture fill */
- fill.r = fill.g = 0;
- fill.b = fill.a = 255;
- warning("texture fill not supported yet. Filling with black.");
- }
- if(type == 0) s_box(name, width, height, color, linewidth, fill, dofill);
- else if(type==1) s_circle(name, r, color, linewidth, fill, dofill);
- else if(type==2) s_textshape(name, font, text, color, linewidth, fill, dofill);
+
+ if(type == 0) s_box(name, width, height, color, linewidth, fillstr);
+ else if(type==1) s_circle(name, r, color, linewidth, fillstr);
+ else if(type==2) s_textshape(name, font, text, color, linewidth, fillstr);
return 0;
}
-static int c_shape(map_t*args)
+static int c_swf(map_t*args)
{
char*name = lu(args, "name");
char*filename = lu(args, "filename");
- s_shape(name, filename);
+ char*command = lu(args, "commandname");
+ if(!strcmp(command, "shape"))
+ warning("Please use .swf instead of .shape");
+ s_includeswf(name, filename);
return 0;
}
return 0;
}
+static int c_sound(map_t*args)
+{
+ char*name = lu(args, "name");
+ char*filename = lu(args, "filename");
+ s_sound(name, filename);
+ return 0;
+}
+
static int c_text(map_t*args)
{
char*name = lu(args, "name");
return 0;
}
+static int c_soundtrack(map_t*args)
+{
+ return 0;
+}
+
+static int c_image(map_t*args)
+{
+ char*command = lu(args, "commandname");
+ char*name = lu(args, "name");
+ char*filename = lu(args, "filename");
+ if(!strcmp(command,"jpeg")) {
+ int quality = (int)(parsePercent(lu(args, "quality"))*100);
+ s_image(name, "jpeg", filename, quality);
+ } else {
+ s_image(name, "png", filename, 0);
+ }
+ return 0;
+}
+
int fakechar(map_t*args)
{
char*name = lu(args, "name");
- s_box(name, 0, 0, black, 20, black, 0);
+ s_box(name, 0, 0, black, 20, 0);
return 0;
}
-static int c_circle(map_t*args) {return fakechar(args);}
static int c_egon(map_t*args) {return fakechar(args);}
static int c_button(map_t*args) {return fakechar(args);}
static int c_edittext(map_t*args) {return fakechar(args);}
static int c_morphshape(map_t*args) {return fakechar(args);}
-static int c_image(map_t*args) {return fakechar(args);}
static int c_movie(map_t*args) {return fakechar(args);}
-static int c_sound(map_t*args) {return fakechar(args);}
-
-static int c_play(map_t*args) {return 0;}
-static int c_stop(map_t*args) {return 0;}
-static int c_soundtrack(map_t*args) {return 0;}
static int c_buttonsounds(map_t*args) {return 0;}
static int c_buttonput(map_t*args) {return 0;}
static int c_texture(map_t*args) {return 0;}
command_func_t* func;
char*arguments;
} arguments[] =
-{{"swf", c_swf, "bbox=autocrop version=5 fps=50 name=!default! @compress=default"},
- {"frame", c_frame, "n=<plus>1"},
-
- // "import" type stuff
- {"shape", c_shape, "name filename"},
+{{"flash", c_flash, "bbox=autocrop background=black version=5 fps=50 name=!default! @compress=default"},
+ {"frame", c_frame, "n=<plus>1 @cut=no"},
+ // "import" type stuff
+ {"swf", c_swf, "name filename"},
+ {"shape", c_swf, "name filename"},
{"morphshape", c_morphshape, "name start end"},
{"jpeg", c_image, "name filename quality=80%"},
{"png", c_image, "name filename"},
{"font", c_font, "name filename"},
{"soundtrack", c_soundtrack, "filename"},
+ // generators of primitives
+
+ {"point", c_point, "name x=0 y=0"},
+ {"gradient", c_gradient, "name"},
+
// character generators
{"box", c_primitive, "name width height color=white line=1 @fill=none"},
{"circle", c_primitive, "name r color=white line=1 @fill=none"},
{"textshape", c_primitive, "name text font color=white line=1 @fill=none"},
+
{"egon", c_egon, "name vertices color=white line=1 @fill=none"},
{"button", c_button, "name shape over=*shape press=*shape area=*shape"},
{"text", c_text, "name text font size=100% color=white"},
// virtual object placement
{"buttonput", c_buttonput, "<i> x=0 y=0 red=+0 green=+0 blue=+0 alpha=+0 luminance= scale= scalex=100% scaley=100% shear=0 rotate=0 above= below="},
{"texture", c_texture, "<i> x=0 y=0 scale= scalex=100% scaley=100% shear=0 rotate=0"},
- {"point", c_point, "name x=0 y=0"},
// commands which start a block
//startclip (see above)
len = pos;
/* for(t=0;t<len;t++) {
- printf("(%d) %s=%s %s\n", t, strndup(name[t], namelen[t]), strndup(value[t], valuelen[t]),
+ printf("(%d) %s=%s %s\n", t, strdup_n(name[t], namelen[t]), strdup_n(value[t], valuelen[t]),
isboolean[t]?"(boolean)":"");
}*/
value[pos].str = text;
value[pos].len = strlen(text);
/*printf("setting boolean parameter %s (to %s)\n",
- strndup(name[pos], namelen[pos]),
- strndup(value[pos], valuelen[pos]));*/
+ strdup_n(name[pos], namelen[pos]),
+ strdup_n(value[pos], valuelen[pos]));*/
break;
}
}
if((type == ASSIGNMENT && !strncmp(name[pos].str, text, name[pos].len>textlen?name[pos].len:textlen)) ||
(type != ASSIGNMENT && !set[pos])) {
if(set[pos]) {
- syntaxerror("value %s set twice (old value:%s)", text, strndup(value[pos].str, value[pos].len));
+ syntaxerror("value %s set twice (old value:%s)", text, strdup_n(value[pos].str, value[pos].len));
}
if(type == ASSIGNMENT)
readToken();
value[pos].len = strlen(text);
#if 0//def DEBUG
printf("setting parameter %s (to %s)\n",
- strndup(name[pos].str, name[pos].len),
- strndup(value[pos].str, value[pos].len));
+ strdup_n(name[pos].str, name[pos].len),
+ strdup_n(value[pos].str, value[pos].len));
#endif
break;
}
}
#if 0//def DEBUG
for(t=0;t<len;t++) {
- printf("%s=%s\n", strndup(name[t].str, name[t].len), strndup(value[t].str, value[t].len));
+ printf("%s=%s\n", strdup_n(name[t].str, name[t].len), strdup_n(value[t].str, value[t].len));
}
#endif
for(t=0;t<len;t++) {
}
if(value[t].str == 0) {
pushBack();
- syntaxerror("value for parameter %s missing (no default)", strndup(name[t].str, name[t].len));
+ syntaxerror("value for parameter %s missing (no default)", strdup_n(name[t].str, name[t].len));
}
}
int nr = -1;
for(t=0;t<sizeof(arguments)/sizeof(arguments[0]);t++) {
if(!strcmp(arguments[t].command, command)) {
+
+ /* ugly hack- will be removed soon (once documentation and .sc generating
+ utilities have been changed) */
+ if(!strcmp(command, "swf") && !stackpos) {
+ warning("Please use .flash instead of .swf- this will be mandatory soon");
+ command = "flash";
+ t = 0;
+ }
+
args = parseArguments(command, arguments[t].arguments);
nr = t;
+ break;
}
}
if(nr<0)