procedure _tostr_proc(var s:string); begin // TODO end; const lng_count = 1; lngs:array[0..lng_count-1] of TLangRec = ( (entry:'EntryPoint'; name:'cpp'; str_del_o: '_T("'; str_del_c: '")'; op_del: ' + '; var_mask:'%n%i'; tostr_proc:_tostr_proc) ); var UT_wxDateTime:integer; function _getType(dt:PScData):integer; begin Result := dt.getType; if(Result = data_code)or(Result = data_array)then Result := dt.getSubType; end; function _toCode(data:PScData; toType:byte):PScData; var ok:boolean; begin Result := data; ok := false; case toType of data_int: case _getType(data) of data_null: begin Result := MakeData('0', true); ok := true; end; data_str: begin Result := MakeData('atoi(', true); Result.AddValue(data, true); Result.AddValue(MakeData(')', true), true); ok := true; end; data_real: begin Result := MakeData('(int) round(', true); Result.AddValue(data, true); Result.AddValue(MakeData(')', true), true); ok := true; end; end; data_str: case _getType(data) of data_null: begin Result := MakeData(''); ok := true; end; data_int: begin Result := MakeData('wxString::Format ("%d", ', true); Result.AddValue(data, true); Result.AddValue(MakeData(')', true), true); ok := true; end; data_real: begin Result := MakeData('wxString::Format("%f", ', true); Result.AddValue(data, true); Result.AddValue(MakeData(')', true), true); ok := true; end; end; data_real: case _getType(data) of data_null: begin Result := MakeData('0.0', true); ok := true; end; data_str: begin Result := MakeData('atof(', true); Result.AddValue(data, true); Result.AddValue(MakeData(')', true), true); ok := true; end; end end; if ok then Result.SetSubType(toType); end; type lng_indexer = ( lng_begin, lng_end, lng_blk_priv_var, lng_blk_loc_var, lng_project_name, lng_get_type, lng_decl_var, lng_get_type_name, lng_to_color, lng_last); function _cpp_type(b:byte):string; begin case b of data_int: result := 'int'; data_str: result := 'wxString'; data_real: result := 'float'; else Result := ''; end; end; function lng_proc(parser:TParser; obj:pointer; index:integer; args:TArgs):TScData; var dt,d:PScData; old,s:string; buf:array[0..256] of char; t,b,r:byte; begin Result.SetValue(''); case lng_indexer(index) of lng_begin: begin parser.codeb.level := parser.codeb.level + 1; parser.Print('{'); parser.PrintLine; end; lng_end: begin parser.Print('}'); parser.PrintLine; parser.codeb.level := parser.codeb.level - 1; end; lng_blk_priv_var: begin dt := GVarList.find('blk_priv'); if dt = nil then parser.debug('BLK_PRIV - not found') else begin old := parser.codeb.select(dt.toStr()); parser.Print(args.Values[1].toStr); parser.Print(' ' + args.Values[0].toStr + ';'); parser.PrintLine; parser.codeb.select(old); end; end; lng_blk_loc_var: begin dt := GVarList.find('blk_loc'); if dt = nil then parser.debug('BLK_LOC - not found') else begin old := parser.codeb.select(dt.toStr()); parser.Print(args.Values[1].toStr); parser.Print(' ' + args.Values[0].toStr + ';'); parser.PrintLine; parser.codeb.select(old); end; end; lng_project_name: begin integer(pointer(@buf[0])^) := parser.el; parser.cgt.GetParam(PARAM_PROJECT_NAME, @buf[0]); Result.SetValue(ExtractFileNameWOExt(buf)); end; lng_get_type: begin Result.Setvalue(_getType(args.Values[0])); end; lng_decl_var: begin d := Parser.regGVar(args.Values[0].toStr()); t := args.Values[1].toInt(); if(t <> data_int)and(t <> data_real)then t := data_str; d.SetSubType(t); s := d.toCode(); if args.Values[3].toInt() = 0 then begin dt := GVarList.find('blk_priv'); if dt = nil then begin parser.debug('BLK_PRIV - not found'); exit; end else begin old := parser.codeb.select(dt.toStr()); parser.Print(_cpp_type(d.GetSubType()) + ' ' + s + ';'); parser.PrintLine; parser.codeb.select(old); end; dt := GVarList.find('blk_body'); if dt = nil then begin parser.debug('BLK_BODY - not found'); exit; end else begin old := parser.codeb.select(dt.toStr()); parser.Print(s + ' = ' + args.Values[2].toCode() + ';'); parser.PrintLine; parser.codeb.select(old); end; end else begin dt := GVarList.find('blk_loc'); if dt = nil then begin parser.debug('BLK_LOC - not found'); exit; end else begin old := parser.codeb.select(dt.toStr()); parser.Print(_cpp_type(d.GetSubType()) + ' ' + s + ' = ' + args.Values[2].toCode() + ';'); parser.PrintLine; parser.codeb.select(old); end; end; end; lng_to_color: begin r := args.Values[0].toInt() and $0000FF; t := (args.Values[0].toInt() and $00FF00) shr 8; b := (args.Values[0].toInt() and $FF0000) shr 16; Result.SetValue('wxColour(' + int2str(r) + ',' + int2str(t) + ',' + int2str(b) + ',' + args.Values[1].toCode() + ')', data_code); end; lng_get_type_name: begin case args.Values[0].toInt() of data_int: Result.SetValue('int'); data_str: Result.SetValue('wxString'); data_real: Result.SetValue('float'); else Result.SetValue(''); end; end; end; end; procedure fill_lng_object(var methods:TAObjMethod; var count:integer); begin UT_wxDateTime := RegisterUserType('wxDateTime'); count := integer(lng_last); setlength(methods, count); methods[integer(lng_begin)] := MakeMethod('begin', 0, ''); methods[integer(lng_end)] := MakeMethod('end', 0, ''); methods[integer(lng_blk_priv_var)] := MakeMethod('decl_priv_var', 2, 'name, type'); methods[integer(lng_blk_loc_var)] := MakeMethod('decl_loc_var', 2, 'name, type'); methods[integer(lng_project_name)] := MakeMethod('project_name', 0, ''); methods[integer(lng_get_type)] := MakeMethod('get_type', 1, 'expression'); methods[integer(lng_decl_var)] := MakeMethod('decl_var', 4, 'var, type, default, scope'); methods[integer(lng_get_type_name)] := MakeMethod('get_type_name', 1, 'type'); methods[integer(lng_to_color)] := MakeMethod('to_color', 2, 'color, alpha'); end;