package org.jerlang.erts.emulator.op; import org.jerlang.Module; import org.jerlang.Process; import org.jerlang.erts.emulator.Instruction; import org.jerlang.stdlib.beam_lib.StringTableChunk; import org.jerlang.type.BitString; import org.jerlang.type.List; import org.jerlang.type.Term; import org.jerlang.type.stack.BinMatchState; /** * Take a BinMatchState and compare Bits against String chunk data * starting at position Val. * * Arguments: * 1. Fail * 2. BinMatchState * 3. Bits * 4. Val * * Example: * {bs_match_string,{f,3},{x,0},8,0} */ public class BsMatchString { public static Term execute(Process proc, Module m, Instruction i, List params) { BinMatchState bms = i.arg(1).toArg(proc).toBinMatchState(); int length = i.arg(2).toInteger().toInt(); int offset = i.arg(3).toInteger().toInt(); StringTableChunk stc = m.beamData().stringTableChunk(); BitString pattern = stc.strings().extract_bitstring(offset, length); if (bms.match(pattern)) { return null; } else { return i.arg(0); } } }