flat assembler
Message board for the users of flat assembler.
 Home   FAQ   Search   Register 
 Profile   Log in to check your private messages   Log in 
flat assembler > Macroinstructions > [fasmg] struc ? and struc name

Author
Thread Post new topic Reply to topic
zhak



Joined: 12 Apr 2005
Posts: 473
Location: Belarus
[fasmg] struc ? and struc name
Long story short, having the below definitions, why match type more, def: is not processed for named struc defined from struct macro -- I never reach here! point from struct LINE


Code:

define @mode
@mode = 64

; ---------------------------------------------------

macro struct name*
  local n

  display 'struct ', `name,13,10

  define name
  namespace name
  virtual at 0
  n = 0
  struc (__name__? def&
    local m

    display '    ', `__name__,0x20, `def,13,10

    match type moredef:

      display 'here!',13,10

      __name__ def
    end match
  end struc

  macro end?.struct?!
    restruc ?
    end namespace
    sizeof.name = $
    end virtual

    struc (__name__name def&
      display '>>', `__name__0x20, `name,13,10
    end struc

    purge end?.struct?
  end macro
end macro

struct POINT
  x intn
  y intn
end struct

struct LINE
  startpoint POINT
  endpoint POINT
end struct


;------------------ just helpers below -------------


element datatype
element generic:  datatype
element aligned:  datatype
element natural:  datatype

macro align? n*, x:?
  if n > 0
    emit 1: (n - 1) - ($ + n - 1mod (ndup (x)
  else if n <> 0
    err 'invalid argument'
  end if
end macro

macro datatypes metadef&
  irp <namesize>, def
    element namemeta + size
    macro name args:?&
      local mn
      m = name metadata 1
      n = m scale 0
      if n = 0
        n = @mode / 8
      end if
      if m relativeto aligned | m relativeto natural
        align n
      end if
      match [value], args
        emit n: (0 + valuedup ?
      else
        emit nargs
      end match
    end macro
    struc (__name__name args:?&
      local mn
      m = name metadata 1
      n = m scale 0
      if n = 0
        n = @mode / 8
      end if
      if m relativeto aligned | m relativeto natural
        align n
      end if
      label .n
      match [value], args
        emit n: (0 + valuedup ?
      else
        emit nargs
      end match
      __name__.__size = n
      __name__.__length = $ - .
    end struc
  end irp
end macro

datatypes alignedint8,1int16,2int32,4int64,8
datatypes naturalintn,0
; ---------------------------------------------------


Post 02 Jun 2017, 11:30
View user's profile Send private message Reply with quote
Tomasz Grysztar
Assembly Artist


Joined: 16 Jun 2003
Posts: 6513
Location: Kraków, Poland
You have POINT expression-class symbol defined as a symbolic variable with empty text. So when you do:

Code:
match type morePOINT:

the text that is matched becomes simply ":", since the "POINT" is replaced with empty text. You can detect this by replacing your debugging display just above that MATCH with this one:

Code:
    match anydef:
        display ' -  ',`__name__,0x20,`any,13,10
    end match



To match the text without performing replacements of symbolic variables you can use the old trick from fasm 1:

Code:
    local proxy
    define proxy def:
    match type moreproxy



PS. Just in case you thought that you could use RAWMATCH to do it without proxy: I would not recommend it, because it also discards any recognition context from the text it matches. RAWMATCH is not a shortcut for the above construction, it is only useful when you're interested in the text as-is and not the values of symbols that the text may represent.
Post 02 Jun 2017, 12:18
View user's profile Send private message Visit poster's website Reply with quote
zhak



Joined: 12 Apr 2005
Posts: 473
Location: Belarus
Ah, that define thing. Thanks, Tomasz.
If I do

Code:

define name name



could there be any problems? This seems to resolve the issue
Post 02 Jun 2017, 12:42
View user's profile Send private message Reply with quote
Tomasz Grysztar
Assembly Artist


Joined: 16 Jun 2003
Posts: 6513
Location: Kraków, Poland

zhak wrote:
Ah, that define thing. Thanks, Tomasz.
If I do

Code:

define name name



could there be any problems? This seems to resolve the issue

That's a clever trick. This would create a circular reference if the symbol was used in an expression, but as this symbol is not intended to be used in an expression anyway, I think it might be even better than defining it with empty value - because when it has empty value you can put it into an expression with no actual effect, and in this case it would at least signal some error (circular reference).
Post 02 Jun 2017, 12:49
View user's profile Send private message Visit poster's website Reply with quote
Display posts from previous:
Post new topic Reply to topic

Jump to:  


< Last Thread | Next Thread >

Forum Rules:
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum
You cannot attach files in this forum
You can download files in this forum


Powered by phpBB © 2001-2005 phpBB Group.

Main index   Download   Documentation   Examples   Message board
Copyright © 2004-2016, Tomasz Grysztar.