Compare commits

...

421 Commits

Author SHA1 Message Date
Atemo
aac7c0c04f Updated jobs 4th Hp and Sp 2023-11-04 22:35:56 +01:00
munkrej
66dddb3b19 Fixes RK_DRAGONBREATH/RK_DRAGONBREATH_WATER scaling with 4th job (#7996)
Corrected POW scaling
Corrected P.ATK scaling
Corrected skills scaling with Dragonic Aura buff
2023-11-03 14:07:28 +01:00
idk-whoami
a8b7f929f6 Fixed an issue in eden market (#8002) 2023-11-03 14:03:28 +01:00
Vincent Stumpf
02cd29c57b Set mob's jname to name if not specified (#8003)
Fixes #8001
2023-11-03 08:25:35 -04:00
idk-whoami
676c2483ac Script correction of Record of Mage (ID 490288) (#7997) 2023-11-01 17:21:10 +01:00
Atemo
ebabfd8807 Implemented DK_DRAGONIC_BREATH (#7985)
Deals normal long ranged physical damage to the target.
    Can only be used when riding dragon.
    Deals additional damage depends on user's MaxHP and MaxSP.
    Affected by Hit/Flee calculation.
    Ignores physical defense.
    Damage property depends on weapon property.
    Affected by attack modifiers (such as race modifier).
    Recovers 2 AP.
    When using while under Dragonic Aura buff, increases influence of MaxHP and MaxSP in skill damage.
    Fixed casting time : 0.5 seconds (based on level 10).
    Variable Casting time : 2 seconds (based on level 10).
    Cooldown: 0.5 seconds (based on level 10).
    Global cool time : 0.15 seconds (based on level 10).

Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>

Credit to @datawulf
2023-11-01 15:47:54 +01:00
Atemo
da9e321330 Implemented new Biolo skills (#7987)
* Implemented BO_EXPLOSIVE_POWDER
- Deals melee physical damage to all targets around the user.
- Doesn't need any catalyst.
- When using while under Research Report buff, increases damage and number of hit.
- Recovers 2 AP.
- Fixed casting time : - (based on level 5).
- Variable Casting time : - (based on level 5).
- Cooldown: 0.7 seconds (based on level 5).
- Global cool time : 0.25 seconds (based on level 5).

* Implemented BO_MAYHEMIC_THORNS
- Deals long ranged physical damage to the target and surrounding enemies around the target with the range up to 9x9 cells.
- Doesn't need any catalyst.
- Has a chance to trigger critical, the critical chance is the user's cri.
- When using while under Research Report buff, increases damage and number of hit.
- Recovers 2 AP.
- Fixed casting time : 0.5 seconds (based on level 10).
- Variable Casting time : 1 second (based on level 10).
- Cooldown: 0.7 seconds (based on level 10).
- Global cool time : 0.15 seconds (based on level 10).

* Skills updated to 2nd rebalance

Credit to @datawulf
2023-10-30 22:07:29 +01:00
Atemo
eec9d34ead Implemented new Meister skills (#7986)
* Implemented MT_MIGHTY_SMASH
- Deals melee physical damage to all targets around the user.
- When using while under Axe Stomp buff, increases damage and number of hit.
- Fixed casting time : - (based on level 10).
- Variable Casting time : - (based on level 10).
- Cooldown: 0.3 seconds (based on level 10).
- Global cool time : - (based on level 10).

* Updated Mighty Smash to last rebalance
- Increases cooldown from 0.3 seconds to 0.5 seconds.
- Adds global cool time by 0.25 seconds.
- Increases SP consumption from 78 to 95 based on level 10.
- Reduces base damage from 3100%/3150%Atk to 1825%/1850%Atk per hit based on level 10.
- Increases number of hit from 3/5 hits to 5/7 hits.
- While under Axe Stomp buff, increases factor weight of POW in skill formula from 7 to 10.

* Implemented MT_TRIPLE_LASER
- Deals long ranged physical damage to the target.
- Can only be used when using Madogear.
- Has a chance to trigger critical, the critical chance is the user's cri.
- Damage property depends on weapon property.
- Doesn't consume magic gear fuel or cannonball.
- Fixed casting time : 0.5 seconds (based on level 5).
- Variable Casting time : 1 seconds (based on level 5).
- Cooldown: 0.25 seconds (based on level 5).
- Global cool time : - (based on level 5).

* Updated Triple Laser to last rebalance
- Increases cooldown from 0.25 seconds to 0.35 seconds.
- Adds global cool time by 0.25 seconds.
- Increases base damage from 3300%Atk to 5050%Atk per hit based on level 5.
- Increases factor weight of POW in skill formula from 10 to 12.

* Implemented MT_SPARK_BLASTER
- Deals long ranged physical damage to the target and surrounding enemies around the target with the range up to 9x9 cells.
- Can only be used when using Madogear.
- Affected by Hit/Flee calculation.
- Ignores physical defense.
- Doesn't consume magic gear fuel or cannonball.
- Damage property depends on weapon property.
- Recovers 2 AP.
- Fixed casting time : 0.5 seconds (based on level 10).
- Variable Casting time : 1.5 seconds (based on level 10).
- Cooldown: 0.7 seconds (based on level 10).
- Global cool time : 0.25 seconds (based on level 10).

* Updated Spark Blaster to last rebalance
- Reduces cooldown from 0.7 seconds to 0.5 seconds.
- Increases base damage from 7750%Atk to 9250%Atk based on level 10.

Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>

Credits to @datawulf
2023-10-30 16:34:52 +01:00
Sapito Sucio
f000e76ba4 Fixed some typos in several city scripts (#7995)
Co-authored-by: Daegaladh <Daegaladh@users.noreply.github.com>
2023-10-30 09:43:27 +01:00
Sapito Sucio
f48823fe73 Fixed some typos in Gungslinger, Ninja, Taekwon and Dandelion quests (#7993)
Co-authored-by: Daegaladh <Daegaladh@users.noreply.github.com>
2023-10-30 08:35:26 +01:00
Sapito Sucio
8459fc8dbb Fixed some typos in Rogue's Job script (#7991) 2023-10-30 08:27:44 +01:00
Aleos
3e3a716468 Fix pre-re Mercenary skills (#7981) 2023-10-26 19:49:30 -04:00
Aleos
b794224b18 Corrects duplicate NPC name in Moscovia Inn (#7983)
* Fixes #7979.
* Removes a duplicate NPC name title for the Moscovia Inn script.
Thanks to @Daraen1!
2023-10-25 14:11:42 -04:00
Aleos
2487d2bf79 Implement s_mob_db constructor (#7799)
* Follow up to 65200eb.
* Removes a lot of else cases when parsing monster data.
* Fixes an issue where the damagetaken value of monsters would be reset after issuing a mob_spawn().
Thanks to @Lemongrass3110, @mplaten, and @vstumpf!
2023-10-25 08:58:04 -04:00
Danilo Lemes
ba1ed0f6ee Update docs from txt to Markdown (#7975)
* Update and rename packet_struct_notation.txt to packet_struct_notation.md
* Update and rename achievements.txt to achievements.md
* Update and rename effect_list.txt to effect_list.md

---------

Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
Co-authored-by: Atemo <Atemo@users.noreply.github.com>
Co-authored-by: Aleos <aleos89@users.noreply.github.com>
2023-10-20 11:00:52 -04:00
Atemo
1e4475b438 Updated item_group_db.yml (#6543)
Boxes updated :
* Updated item scripts
* Item scripts converted to item group
2023-10-18 21:32:30 +02:00
Pokye
62a49a2d5a Update Effect List (#7960)
* Adds effect constant names to the list.
2023-10-18 09:24:34 -04:00
idk-whoami
1d5fdbad80 Script correction of Jeje Cap (ID 19453) (#7967) 2023-10-15 17:11:03 +02:00
Atemo
6c5be5b7df Updated Item Trade (#7964) 2023-10-11 14:54:02 +02:00
Atemo
b4e066a37f Extended item_group_db.yml (#6173)
* Added Index field
  The structure now allows to define the same item with different data
* Updated the tool yamlupgrade for version upgrade
2023-10-10 17:21:09 +02:00
idk-whoami
61311f5912 Corrected script for some item #25 (#7946) 2023-10-10 13:47:08 +02:00
Harvin
4547dc8e6a Fix and update guild storage item bound retrieve (#7956) 2023-10-08 22:38:33 +02:00
Harvin
0e9ae33f64 Fix mailing special card (#7950)
Fixes #7947

Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2023-10-05 09:12:09 +02:00
Lemongrass3110
7977612e0b Refactored SC_LERADSDEW (#7958)
Now it also makes use of the Fail configuration in YAML
2023-10-05 08:26:05 +02:00
Aleos
bbb6a9e90c Fixes Spiderweb SCS_NOMOVECOND (#7953)
* Fixes #7948.
* Removes Spiderweb from the SCS_NOMOVECOND checks.
* Follow up to f28d207.
Thanks to @izecold!
2023-10-04 19:15:11 -04:00
Lemongrass3110
f5889b08ea Implemented the new unequip all button (#7955)
With this button you can also unequip all costumes now.
Also the button will now unequip your arrows.

Thanks to @Dia and @Pokye
2023-10-05 01:12:49 +02:00
eppc0330
5b2f4e63a7 Fix temp skill not removed (#7939)
Fixes #5382
2023-10-03 16:18:02 +02:00
eppc0330
a7f05bf696 Fixed marketshop not sending empty stocks (#7932)
Fix sold out item removed on sale list of marketshop.
Now the item icon still exist in marketshop as gray icon.

Fixes #7931
2023-10-02 23:39:29 +02:00
Atemo
8b6c072ff5 Enabled some missing NPCs on memorial initialization (#7945)
Thanks to @Dieby
2023-09-26 16:04:59 +02:00
mazvi
00a9077dd6 Corrected Lich_Lord_Card item script (#7943) 2023-09-26 15:36:29 +02:00
Atemo
73604e370f Updated item DB and mapcache up to september 2023 (#7940)
* Added new items
* Item scripts corrections
* Updated item prices
* Updated mapcache
* Corrected Royal Guardian Ring and Lich Lord Card Position

Thanks to @mazvi
2023-09-24 14:25:47 +02:00
Lemon
1bc9748755 Fixes crit calculation on pre-renewal (#7938) 2023-09-21 16:04:15 +02:00
mazvi
dd2c582179 Update upgrade_20230913.sql (#7935)
Resolve Issue: SQL 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '' at line 2
2023-09-19 08:42:05 +02:00
Kanin Temsrisuk
fffad65480 Corrections in Item DB. (#7928)
* Fixed wrong item bonus (Item Drop)
* Removed duplicate id
* Fixed wrong item bonus (Race)
* Fixed item type
2023-09-15 22:40:34 +02:00
Atemo
8196149b2b Additional check in script_instancegetid (#7929) 2023-09-15 17:36:50 +02:00
elanosilveira
10c78203ba Fixes missing else case in pre-re Archer quest (#7856)
Co-authored-by: Aleos <aleos89@users.noreply.github.com>
Co-authored-by: Daegaladh <Daegaladh@users.noreply.github.com>
2023-09-15 13:52:10 +02:00
eppc0330
a7ea96afa9 Item DB corrections (#7919)
* Implemented status change SC_G_LIFEPOTION 
* Corrected status change SC_ALMIGHTY
2023-09-14 22:49:11 +02:00
Aleos
442cf87fcc Fixes monster escape AI issues (#7927)
* Fixes #7904 and fixes #7916.
* Resolves NPC_RUN and NPC_RANDOMMOVE monsters not always reaching their intended escape distance.
* Resolves Marine Sphere calling the run skill too early resulting in the distance escaped not always being the same.
* Resolves Wink of Charm not forcing the target to fail skill use on the caster.
* Renames the monster alchemist state to can_escape to fit multiple uses.
Thanks to @Leemonn and @Lemongrass3110!
2023-09-14 12:41:47 -04:00
Aleos
6e0a5bfa83 Adds missing mob SQL column for Illusion Turtle (#7926)
* Fixes #7925.
* Follow up to 0f18869.
Thanks to @SpineOfSteel and @Atemo!
Co-authored-by: Atemo <capucrath@gmail.com>
2023-09-13 08:50:30 -04:00
eppc0330
6fb5120b8c Fix RG_PLAGIARISM aspd bonus (#7922)
* Fixes #7921.
2023-09-08 10:41:21 -04:00
eppc0330
c600d817ba SR_TIGERCANNON behavior fix (#7895)
* Fixes #7894.
2023-09-08 08:56:51 -04:00
Atemo
cdf377e071 Added Mysterious Cookie Shop NPC (#7915)
* NPC who opens several barter shops. Each shop exchange mileage coupons (obtainable via events, cash shop) to etc costume stones (used to enchant costumes) or costumes.

Thanks to @Lemongrass3110 !
2023-09-07 15:11:20 +02:00
Aleos
f4fa967991 Adds buy/sell safety check for Market Shops (#7840)
* Fixes #7191.
* Adds a buy and sell safety check from the Market Shop type.
* Also includes an item validation check when loading items from SQL for Market Shops.
Thanks to @mazvi!
2023-09-05 13:34:40 -04:00
idk-whoami
0f18869276 Corrected script for some item #24 (#7914)
Thanks to @Atemo
2023-09-01 17:13:05 +02:00
Atemo
ffd940b2b5 Updated item DB up to august 30 2023 (#7913) 2023-08-31 00:18:28 +02:00
Atemo
149439a25d Item Database corrections (#7912)
* Replace grade values by constants
* Corrections and update of the item database according to EquipmentProperties.lub from the client
2023-08-30 20:12:27 +02:00
Atemo
673ef066fb Uncommented Illusion investigation - Illusion of twins quest (#7911) 2023-08-29 15:56:58 +02:00
Atemo
b37107853a Some correction in Illusion investigation NPCs (#7855)
* Some correction in Illusion investigation NPCs
* After discussion, 9ddd26f1e2 reverted to not using same NPC name as Kiel quest
* Corrections of the questinfo QTYPE

Thanks to @crazy-arashi, @Pokye
2023-08-29 14:52:28 +02:00
mazvi
3cf70659fa Updated illusion_investigation.txt (#7908)
Enabled Illusion Investigation: Illusion of Twins
2023-08-28 16:31:12 +02:00
inhyositsu
209de449c9 Don’t exit the process during a crash (#7902)
* Do not exit the process while receiving crash signal so that the system will make core dump correctly.
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2023-08-27 19:14:06 -04:00
Atemo
eadfa053f6 Rebalance Troubadour & Trouvere 20220608 (3rd) (#7898)
* Sound Blend
- Reduces SP consumption from 128 to 80 based on level 5.

* Metallic Fury
- Reduces cooldown from 0.5 seconds to 0.3 seconds.
- Reduces SP consumption from 168 to 94 based on level 5.
- Reduces AP recovery rate from 3 to 2 based on level 5.
- Increases damage from 4500%/4950~6750%(area damage according to number of branded target)Matk to 11000%/12500~18500%(area damage according to number of branded target)Matk based on level 5.

* Rhythm Shooting
- Adds 0.15 seconds cooldown.
- Removes 0.15 seconds delay after skill.
- Reduces SP consumption from 90 to 52 based on level 5.
- Increases damage from 600%/780%(branded target)Atk to 800%/1400%(branded target)Atk based on level 5.
- Increases factor weight of CON in skill formula from 2 to 3.

* Rose Blossom
- Reduces variable casting time from 2 seconds to 1 second.
- Increases cooldown from 0.5 seconds to 0.7 seconds.
- Reduces SP consumption from 125 to 94 based on level 5.
- Increases damage from 3750%/1750%(area damage)Atk to 11200%/15250%(area damage)Atk based on level 5.
- Increases factor weight of CON in skill formula from 3/2(area damage) to 3/3(area damage).

Checked against https://github.com/rathena/rathena/pull/7024
Credit to @datawulf for Metallic Fury update
2023-08-16 22:21:26 +02:00
idk-whoami
6611aa731c Corrected script for some item #23 (#7860) 2023-08-16 21:02:37 +02:00
elanosilveira
379009b31f Small changes in spelling and removed duplicated warp portal. (#7873)
The first course of the test had two warp ports very close to each other warping to the same place for no reason.
2023-08-13 14:29:10 +02:00
elanosilveira
a1db6278ac Quest Merchant with repeated serial number in string. (#7868) 2023-08-13 13:52:48 +02:00
Kanin Temsrisuk
4268dd025b Fix Giant Fly Wing bugs (#7887) 2023-08-13 13:45:59 +02:00
Atemo
d53880cf1e Rebalance imperial guard 20220608 (#7893)
* Overslash
- Reduces cooldown from 1 second to 0.7 seconds.
- Reduces SP consumption from 68 to 65 based on level 5.
- Increases AP recovery rate from 2 to 3.
- Increases damage from 1800%Atk to 2200%Atk per hit based on level 10 (Spear & Sword Mastery level 10).

Already implemented
- Increases factor weight of POW in skill formula from 2 to 5.

* Shield Shooting
- Reduces cooldown from 1 second to 0.7 seconds.
- Increases AP recovery rate from 2 to 3.
- Increases damage from 6440%Atk to 14440%Atk based on level 5 (Shield Mastery level 10, shield refine rate is 10 and shield weight is 150).

Already implemented
- Increases factor weight of POW in skill formula from 3 to 5.

Notes
- Factor weight of shield refine rate is taken from next rebalance: "Increases factor weight of shield refine rate in skill formula from 4 to 25."
- Factor weight of the shield weight is deduced from the skill base damage: 11900%Atk on level 5.

* Cross Rain
- Reduces cooldown from 5 seconds to 4.5 seconds.
- Reduces delay after skill from 0.5 seconds to 0.15 seconds.
- Increases SP consumption from 68 to 78 based on level 10.
- Increases AP recovery rate from 5 to 7.
- Increases damage from 2000%/3500%(Holy Shield)Matk to 3700%/5500%(Holy Shield)Matk per hit based on level 10 (Spear & Sword Mastery level 10).

* Grand Judgement
- Reduces cooldown from 60 seconds to 5 seconds.
- Removes 0.5 seconds delay after skill.
- Increases SP consumption from 68 to 78 based on level 10.
- Reduces AP consumption from 150 to 15.
- Reduces duration of Grand Judgement buff from 300 seconds to 150 seconds.
- Increases damage from 7500%/11000%(plant and insect race)Atk to 15250%/16850%(plant and insect race)Atk based on level 10.

* Judgement Cross
- Reduces cooldown from 60 seconds to 5 seconds.
- Removes 0.5 seconds delay after skill.
- Reduces SP consumption from 150 to 105 based on level 10.
- Reduces AP consumption from 150 to 10.
- Increases damage from 7500%/11000%(plant and insect race)Matk to 19500%/21000%(plant and insect race)Matk based on level 10.
2023-08-12 15:01:31 +02:00
Atemo
b3ddb4511c Rebalance dragon knight 20220608 (#7891)
* Vigor
- Changes bonus flat damage from +200% regardless of skill level to scaling with skill level up to +250% based on level 10.
- Increases bonus damage against demihuman and angel race monsters from 50% to 100%.
- Reduces AP consumption from 150 to 125.
- Increases HP consumption on each attack from 2 to 10 based on level 10.

* Dragonic Aura
- Reduces delay after skill from 1 second to 0.5 seconds.
- Increases damage from 9500%/14000%(demihuman and angel race)Atk to 36500%/38000%(demihuman and angel race)Atk based on level 10.

* Madness Crusher
- Removes 0.4 seconds variable casting time.
- Increases fixed casting time from 0.4 seconds to 0.5 seconds.
- Increases damage from 1350%Atk to 5150%Atk based on level 5 (using level 5 weapon and weapon weight is 150). (additional note: 4400% Atk on level 5 without weapon weight)
- Increases SP consumption from 50 to 68 based on level 5.
- Increases AP recovery rate from 2 to 3.
- Increases factor weight of POW in skill formula from 5 to 7.

* Storm Slash
- Reduces cooldown from 0.35 seconds to 0.3 seconds.
- Increases AP recovery rate from 1 to 2.
- Increases damage from 600%Atk to 950%Atk per hit based on level 5.
- Increases the chance to double skill damage while under Giant Growth buff from 15% to 30%.

* Servant Weapon - Demolition
- Reduces cooldown from 3 seconds to 0.5 seconds.
- Reduces AP recovery rate from 3 to 2.
- Increases damage from 750%Atk to 2500%Atk per hit based on level 5.

* Servant Weapon - Phantom
- Removes 0.8 seconds variable casting time.
- Reduces cooldown from 2 seconds to 0.5 seconds.
- Removes 0.8 seconds delay after skill.
- Increases damage from 600%Atk to 1700%Atk per hit based on level 5.

* Servant Weapon
- Increases number of hit from 1 hit to 2 hits.
- Increases damage from 450%Atk to 2500%Atk per hit based on level 5.

* Hack and Slasher
- Changes damage logic from 2 split hits to 2 cumulative hits.
- Increases damage from 3000%Atk to 7300%Atk per hit based on level 10.
- Increases cooldown from 0.3 seconds to 0.7 seconds.
- Reduces delay after skill from 0.5 seconds to 0.25 seconds.
- Increases SP consumption from 70 to 72 based on level 10.
- Increases factor weight of POW in skill formula from 5 to 7.

Thanks to @aleos89 !
2023-08-10 17:56:58 +02:00
Atemo
e30951a032 Rebalance archmage 20220608 (#7889)
* Floral Flare Road
- Reduces delay after skill from 0.5 seconds to 0.25 seconds.
- Increases SP consumption from 70 to 94 based on level 5.
- Increases damage from 1000%Matk to 3750%Matk per hit based on level 5.

* Rain of Crystal
- Reduces delay after skill from 0.5 seconds to 0.25 seconds.
- Increases SP consumption from 80 to 100 based on level 5.
- Increases damage from 750%Matk to 3980%Matk per hit based on level 5.

* Tornado Storm
- Reduces delay after skill from 0.5 seconds to 0.25 seconds.
- Increases SP consumption from 75 to 94 based on level 5.
- Increases damage from 450%Matk to 3900%Matk per hit based on level 5.

* Stratum Tremor
- Reduces delay after skill from 0.5 seconds to 0.25 seconds.
- Increases SP consumption from 75 to 94 based on level 5.
- Increases damage from 1250%Matk to 3750%Matk per hit based on level 5.

* Crimson Arrow
- Reduces SP consumption from 105 to 94 based on level 5.
- Increases AP recovery rate from 1 to 2.

* Frozen Slash
- Increases cooldown from 0.3 seconds to 0.45 seconds.
- Increases SP consumption from 85 to 96 based on level 5.
- Increases AP recovery rate from 1 to 2.
- Increases damage from 3000%/4250%(Climax)Matk to 4750%/6650%(Climax)Matk based on level 5.

* Storm Cannon
- Reduces SP consumption from 100 to 94 based on level 5.
- Increases AP recovery rate from 1 to 2.
- Increases damage from 3000%/4250%(Climax)Matk to 4750%/6250%(Climax)Matk based on level 5.

* Rock Down
- Increases SP consumption from 85 to 92 based on level 5.
- Increases AP recovery rate from 1 to 2.
- Increases damage from 3000%/4250%(Climax)Matk to 4750%/6250%(Climax)Matk based on level 5.

* All Bloom
- Reduces delay after skill from 1 second to 0.5 seconds.
- Increases SP consumption from 100 to 126 based on level 5.
- Increases damage from 500%Matk to 6200%Matk per hit based on level 5.
- No longer reduce skill damage on Climax level 2.
- Increases bonus damage on Climax level 3 from 100% to 300%.
- Increases damage of additional explosion on Climax level 5.

* Crystal Impact
- Reduces cooldown from 6 seconds to 2 seconds.
- Reduces delay after skill from 1 second to 0.5 seconds.
- Increases SP consumption from 120 to 132 based on level 5.
- Increases damage from 4000%/4000%(secondary)Matk to 6750%/6750%(secondary)Matk based on level 5.

* Destructive Hurricane
- Reduces cooldown from 6 seconds to 2 seconds.
- Reduces delay after skill from 1 second to 0.5 seconds.
- Increases SP consumption from 120 to 132 based on level 5.
- Increases damage from 8000%Matk to 14250%Matk based on level 5.
- Increases bonus damage on Climax level 3 from 100% to 200%.
- Reduces bonus damage on Climax level 5 from 70% to 50%.

Skipped (unknown value)
- Increases damage of additional hit on Climax level 1.

* Violent Quake
- Reduces delay after skill from 1 second to 0.5 seconds.
- Increases SP consumption from 100 to 126 based on level 5.
- Increases damage from 600%Matk to 6200%Matk per hit based on level 5.
- Increases bonus damage on Climax level 3 from 100% to 200%.

* Deadly Projection
- Reduces SP consumption from 120 to 90 based on level 5.
- Increases damage from 3600%Matk to 14000%Matk based on level 5.

* Mystery Illusion
- Reduces delay after skill from 1 second to 0.5 seconds.
- Reduces SP consumption from 120 to 110 based on level 5.
- Increases AP recovery rate from 4 to 5.
- Increases damage from 2500%Matk to 4750%Matk per hit based on level 5.

* Astral Strike
- Reduces cooldown from 60 second to 6 seconds.
- Reduces SP consumption from 150 to 130.
- Reduces AP consumption from 150 to 25.
- Increases initial damage from 5000%/11000%(undead and dragon race)Matk to 18000%/21400%(undead and dragon race)Matk based on level 10.
- Increases over time damage from 2000%Matk to 6500%Matk per hit based on level 10.
- Reduces skill duration from 15 seconds to 6 seconds.

* Soul Vulcan Strike
- Increases damage from 900%Matk to 1250%Matk per hit based on level 5.
- Reduces SP consumption from 120 to 110 based on level 5.
2023-08-08 15:07:31 +02:00
Atemo
f4b9748e1f Rebalance elemental master 20220608 (#7888)
* Conflagration
- Increases SP consumption from 110 to 113 based on level 5.
- Increases damage from 2000%/4000%(spirit)Matk to 3750%/5750%(spirit)Matk per hit based on level 5.

* Diamond Storm
- Reduces cooldown from 2 seconds to 1 second.
- Reduces SP consumption from 100 to 96 based on level 5.
- Increases damage from 6250%/12250%(spirit)Matk to 8150%/14400%(spirit)Matk based on level 5.
- Increases factor weight of SPL in skill formula from 5/7(spirit) to 5/10(spirit).

* Lightning Land
- Increases SP consumption from 95 to 110 based on level 5.
- Increases damage from 2000%/4000%(spirit)Matk to 3750%/5750%(spirit)Matk per hit based on level 5.

* Terra Drive
- Reduces cooldown from 2 seconds to 1 second.
- Reduces SP consumption from 100 to 96 based on level 5.
- Increases damage from 6250%/12250%(spirit)Matk to 8150%/14400%(spirit)Matk based on level 5.
- Increases factor weight of SPL in skill formula from 5/7(spirit) to 5/10(spirit).

* Corrected the SPL weight of EM_DIAMOND_STORM and EM_TERRA_DRIVE

* Venom Swamp
- Increases SP consumption from 100 to 112 based on level 5.
- Increases damage from 2000%/4000%(spirit)Matk to 3750%/5750%(spirit)Matk per hit based on level 5.

* Elemental Buster
- Reduces fixed casting time from 2 seconds to 1.5 seconds.
- Reduces cooldown from 60 seconds to 5 seconds.
- Reduces delay after skill from 1.5 seconds to 0.5 seconds.
- Reduces SP consumption from 150 to 140.
- Reduces AP consumption from 150 to 30.
- Increases damage from 4800%/11000%(formless and dragon race)Matk to 22500%/24000%(formless and dragon race)Matk based on level 10.
2023-08-07 22:20:12 +02:00
Atemo
bf1e1b77c8 Update/rebalance abyss chaser 20220608 (#7879)
* Abyss Dagger
- Increases SP consumption from 60 to 64 based on level 5.
- Increases damage from 1750%Atk to 2600%Atk per hit based on level 5.

* Deft Stab
- Increases SP consumption from 55 to 62 based on level 10.
- Increases AP recovery rate from 2 to 3.
- Increases damage from 3600%Atk to 5850%Atk based on level 10.
- Increases area of effect from 5 x 5 cells to 7 x 7 cells based on level 10.

* From the Abyss
- Increases number of hit from 1 hit to 2 hits.
- Increases damage from 500%Matk to 2600%Matk per hit based on level 5.

* Abyss Square
- Increases AP recovery rate from 4 to 5.
- Increases damage from 2000%Matk to 3850%Matk per hit based on level 5 (Magic Sword Mastery level 10).

* Chain Reaction Shot
- Reduces cooldown from 1.5 seconds to 1 second.
- Removes 0.5 seconds delay after skill.
- Reduces SP consumption from 80 to 75 based on level 5.
- Increases area of effect of secondary damage from 3 x 3 cells to 7 x 7 cells.
- Increases area of effect of primary damage from 7 x 7 cells to 9 x 9 cells based on level 5.
- Increases damage from 3000%(primary)/4750%(secondary)Atk to 4250%(primary)/12350%(secondary)Atk based on level 5.
- Increases factor weight of CON in skill formula from 5 to 15.

* Frenzy Shot
- Reduces SP consumption from 125 to 55 based on level 10.
- Increases damage from 3500%Atk to 4000%Atk per hit based on level 10.

* Omega Abyss Strike
- Reduces cooldown from 60 seconds to 3 seconds.
- Reduces SP consumption from 150 to 125.
- Reduces AP consumption from 150 to 15.
- Increases damage from 6000%/11500%(angel and demon race)Matk to 22000%/23500%(angel and demon race)Matk based on level 10.
2023-08-07 18:12:54 +02:00
idk-whoami
d75fb9b64e Corrected script for some item #22 (#7843)
Thanks to @Atemo
2023-08-07 14:47:52 +02:00
Vincent Stumpf
047e5eef6d Bypass drop restriction in mpa_addflooritem when dropping (#7847) 2023-08-04 22:51:55 -07:00
Singe Horizontal
af602d5535 Call script_hasdata before script_getnum in addrid (#7876)
* Fixes #7875.
* Calling script_hasdata before script_getnum in addrid
Co-authored-by: Aleos <aleos89@users.noreply.github.com>
2023-08-04 12:02:35 -04:00
Atemo
40b2d0ff13 Rebalance biolo 20220608 (#7877)
* Full Shadow Protection
- Increases duration from 60 seconds to 180 seconds base on level 4.

* Research Report
- Reduces fixed casting time from 1 second to 0.5 seconds.
- Reduces cooldown from 120 seconds to 60 seconds.
- Increases duration from 60 seconds to 150 seconds.

* Acidified Zone (Water)/(Fire)/(Wind)/(Ground)
- Reduces cooldown from 1 second to 0.5 seconds.
- Reduces delay after skill from 0.5 seconds to 0.15 seconds.
- Reduces SP consumption from 88 to 63 based on level 5.
- Increases number of hit from 5 hits to 7 hits.

* Bionic Pharmacy
- The crafting materials of Icycle/Earth/Gale/Flame Acid Bottle have been changed, reduces amount of Bottle Grenade and Acid Bottle used from 5 each to 1 each, changes materials from elemental ore to elemental point.
2023-08-03 16:58:59 +02:00
Atemo
266194f928 Rebalance inquisitor 20220608 (#7874)
* First Brand
- Reduces cooldown from 0.5 seconds to 0.3 seconds.
- Increases SP consumption from 50 to 62 based on level 5.
- Unifies brand duration to 5 second regardless of skill level.
- Unifies area of effect to 7 x 7 cells regardless of skill level.
- Increases cast range from 2 cells to 3 cells.
- Increases damage from 2250%Atk to 6000%Atk based on level 5.

Already implemented
- Increases factor weight of POW in skill formula from 3 to 5.

* Second Faith
- Reduces cooldown from 1 second to 0.7 seconds.
- Increases SP consumption from 60 to 65 based on level 5.
- Increases AP recovery rate from 1 to 4.
- Unifies area of effect to 7 x 7 cells regardless of skill level.
- Increases damage from 2500%Atk to 11600%Atk based on level 5.

Already implemented:
- Increases factor weight of POW in skill formula from 4 to 5.

* Second Judgement
- Reduces cooldown from 1 second to 0.7 seconds.
- Increases SP consumption from 65 to 70 based on level 5.
- Increases AP recovery rate from 2 to 4.
- Unifies area of effect to 7 x 7 cells regardless of skill level.
- Increases damage from 2625%Atk to 13150%Atk based on level 5.
- Increases factor weight of POW in skill formula from 4 to 7.

* Second Flame
- Reduces cooldown from 1 second to 0.7 seconds.
- Increases SP consumption from 70 to 75 based on level 5.
- Increases AP recovery rate from 3 to 4.
- Unifies area of effect to 7 x 7 cells regardless of skill level.
- Increases damage from 2750%Atk to 14700%Atk based on level 5.
- Increases factor weight of POW in skill formula from 4 to 9.

* Third Punish
- Reduces cooldown from 2 seconds to 1 second.
- Increases number of hit from 2 hits to 3 hits.
- Unifies area of effect to 7 x 7 cells regardless of skill level.
- Increases damage from 3250%Atk to 7850%Atk per hit based on level 5.
- Increases factor weight of POW in skill formula from 5 to 10.

* Third Consecration
- Reduces cooldown from 2 seconds to 1 second.
- Unifies area of effect to 7 x 7 cells regardless of skill level.
- Increases damage from 3250%Atk to 3500%Atk per hit based on level 5.
- Increases factor weight of POW in skill formula from 5 to 10.

* Oleum Sanctum
- Reduces cooldown from 3 seconds to 2 seconds.
- Removes 0.5 seconds delay after skill.
- Increases SP consumption from 70 to 85 based on level 5.
- Increases damage from 2000%Atk to 10500%Atk based on level 5.
- Increases area of effect from 7 x 7 cells to 11 x 11 cells based on level 5.

Already implemented
- Increases factor weight of POW in skill formula from 3 to 5.

* Explosion Blaster
- Reduces cooldown from 1 second to 0.7 seconds.
- Reduces SP consumption from 120 to 90 based on level 5.
- Increases damage from 3250%/4250%(Oleum Sanctum)Atk to 14000%/16000%(Oleum Sanctum)Atk per hit based on level 5.
- Increases area of effect from 9 x 9 cells to 11 x 11 cells based on level 5.
- Increases factor weight of POW in skill formula from 3/5 to 15/15.

* First Faith Power
- Reworks cooldown from 30~150 seconds to 180~60 seconds (level 1~5).
- Unifies duration to 300 seconds regardless of skill level.

* Judge
- Reworks cooldown from 30~150 seconds to 180~60 seconds (level 1~5).
- Unifies duration to 300 seconds regardless of skill level.
- Changes AP consumption from 50 regardless of skill level to scaling with skill level, from 80 on level 1 down to 40 on level 5.

* Third Exorcism Flame
- Reworks cooldown from 30~150 seconds to 180~60 seconds (level 1~5).
- Unifies duration to 300 seconds regardless of skill level.
- Changes AP consumption from 100 regardless of skill level to scaling with skill level, from 120 on level 1 down to 60 on level 5.

* Massive Flame Blaster
- Reduces cooldown from 60 seconds to 5 seconds.
- Removes 1 second delay after skill.
- Reduces AP consumption from 150 to 12.
- Increases damage from 8000%/11000%(demon and brute race)Atk to 21500%/23000%(demon and brute race)Atk based on level 10.
- Increases area of effect from 9 x 9 cells to 11 x 11 cells.
- Increases factor weight of POW in skill formula from 10/10(demon and brute race) to 15/15(demon and brute race).
- Reduces duration of Massive Flame Blaster buff from 300 seconds to 150 seconds.
2023-08-02 20:15:06 +02:00
Atemo
4ce3c460e5 Rebalance cardinal 20220608 (#7871)
* Framen
- Increases SP consumption from 60 to 92 based on level 5.
- Increases AP recovery rate from 1 to 2.
- Increases damage from 2750%/3500%(demon and undead race)Matk to 4250%/4750%(demon and undead race)Matk based on level 5 (Fidus Animus level 10).

* Arbitrium
- Reduces cooldown from 2 seconds to 1.5 seconds.
- Reduces SP consumption from 140 to 112 based on level 10.
- Increases damage from 5000%/6500%(area damage)Matk to 11000%/13500%(area damage)Matk based on level 10.

Additional:
- Updated the factor weight of SPL in skill formula to 7 (according to the next rebalance)

* Petitio
- Reduces cooldown from 1 second to 0.5 seconds.
- Increases SP consumption from 50 to 65 based on level 10.
- Increases AP recovery rate from 2 to 3.
- Increases damage from 3200%Atk to 11500%Atk based on level 10 (Mace & Book Mastery Level 10).

* Competentia
- Reduces AP consumption from 200 to 160 based on level 5.
- Increases duration from 240 seconds to 300 seconds based on level 5.

* Pneumaticus Procella
- Reduces cooldown from 60 seconds to 5 seconds.
- Removes 1.5 seconds delay after skill.
- Reduces AP consumption from 150 to 30.
- Increases damage from 2030%/3050%(demon and undead race)Matk to 21180%/22750%(demon and undead race)Matk per hit based on level 10 (Fidus Animus level 10).

* Effligo
- Reduces cooldown from 60 seconds to 0.5 seconds.
- Removes 1 seconds delay after skill.
- Increases SP consumption from 60 to 75.
- Reduces AP consumption from 100 to 12.
- Increases damage from 8080%/12150%(demon and undead race)Atk to 16580%/18150%(demon and undead race)Atk based on level 10 (Mace & Book Mastery Level 10).
- Reduces factor weight of POW in skill formula from 10/10(demon and undead race) to 7/7(demon and undead race).

Co-authored-by: Aleos <aleos89@users.noreply.github.com>
2023-08-02 14:40:11 +02:00
Atemo
0a87d2f3d6 Rebalance windhawk 20220608 (#7859)
* Hawk Rush
- Increases damage from 1000%Atk to 2500%Atk based on level 5.

* Gale Storm
- Reduces cooldown from 2 seconds to 1.5 seconds.
- Increases damage from 2500%Atk to 9500%Atk based on level 10.

Skipped, not enough info (the values have been changed again)
- Reduces SP consumption from 179 to 100 based on level 10.

* Crescive Bolt
- Reduces delay after skill from 0.5 seconds to 0.3 seconds.
- Reduces SP consumption from 100 to 65 based on level 10.
- Increases damage from 3000%Atk to 3400%Atk based on level 10.
- When reach 3 stacks of Crescive Bolt consecutive attack buff, the duration of buff will be refreshed when reusing Crescive Bolt.

* Deep Blind Trap / Solid Trap / Swift Trap / Flame Trap
- Reduces cooldown to 2.5 seconds.
- Increases SP consumption from 62 to 84 based on level 5.
- Increases area of effect to 7 x 7 cells based on level 5.
- Reduces trap duration to 5 seconds.
- Changes damage interval to 0.5 seconds.
- Reduces AP recovery rate from 4 to 3 based on level 5.
- No longer inflict status ailment to the target.
- Increases damage from 1250%Atk to 4250%Atk per hit based on level 5.

Note: already implemented
- Increases factor weight of CON in skill formula from 3 to 5.

* Hawk Boomerang
- Adds 0.15 seconds cooldown.
- Reduces SP consumption from 120 to 80.
- Reduces AP consumption from 15 to 12.
- Increases damage from 2500%Atk to 3000%Atk based on level 5.

* Updated Gale Storm
- Reduces SP consumption from 179 to 100 based on level 10.

Additionally:
- Updated Crescive Bolt ratio (+10% each hit)
2023-08-01 18:45:14 +02:00
Atemo
c16473eb94 Rebalance meister 20220608 (#7862)
* Axe Stomp
- Reduces cooldown from 1 second to 0.7 seconds.
- Reduces delay after skill from 0.5 seconds to 0.25 seconds.
- Increases SP consumption from 45 to 74 based on level 5.
- Increases duration of Axe Stomp buff from 10 seconds to 30 seconds based on level 5.
- Increases damage from 2000%Atk to 4600%Atk per hit based on level 5.

* Rush Quake
- Removes 0.5 seconds delay after skill.
- Increases damage from 7500%/11000%(formless and insect race)Atk to 36000%/37500%(formless and insect race)Atk based on level 10.
2023-07-31 21:25:20 +02:00
Atemo
d4c7614d80 Correction of the critical formula (renewal) (#7865)
* 1 luk = +0.3 critical
* BaseLevel / 10 = +0.1 critical

Fixed #7865
2023-07-30 14:41:16 +02:00
Atemo
953ec517d4 Follow-up 8d49496177 (#7867)
Corrected a mistake for Eternal Slash
- The total factor weight of POW with Shadow Exceed should be 3.
2023-07-30 01:07:33 +02:00
Atemo
8d49496177 Rebalance shadow cross 20220608 (#7858)
* Savage Impact
- Increases SP consumption from 55 to 72 based on level 10.
- Increases area of effect from 3 x 3 cells to 5 x 5 cells.
- Increases damage from 600%/1000%(Shadow Exceed)Atk to 900%/1100%(Shadow Exceed)Atk per hit based on level 10.

* Eternal Slash
- Reduces cooldown from 0.75 seconds to 0.5 seconds.
- Reduces damage from 1750%/2500%(Shadow Exceed)Atk to 1325%/1825%(Shadow Exceed)Atk per hit based on level 5.
- Increases SP consumption from 40 to 60 based on level 5.
- Increases cast range from 2 cells to 3 cells.
- Reduces factor weight of POW in skill formula from 5/7(Shadow Exceed) to 2/3(Shadow Exceed).

* Impact Crater
- Reduces cooldown from 5 seconds to 1.5 seconds.
- Removes delay after skill.
- Increases SP consumption from 54 to 78 based on level 5.
- Reduces AP recovery rate from 5 to 3.
- Increases damage from 325%Atk to 400%Atk per hit based on level 5.

* Shadow Stab
- Reduces SP consumption from 65 to 60 based on level 5.
- Increases AP recovery rate from 1 to 2.
- Reduces cooldown from 1 seconds to 0.35 seconds.
- Removes 0.5 seconds delay after skill.
- Reduces damage from 3750%Atk to 1500%Atk per hit based on level 5.

* Potent Venom
- Increases duration from 120 seconds to 300 seconds based on level 10.
- Reduces physical resistance ignoring from 30% to 20% based on level 10.

* Fatal Shadow Claw
- Reduces fixed casting time from 1.5 seconds to 0.5 seconds.
- Reduces variable casting time from 4 seconds to 0.5 seconds.
- Removes 0.5 seconds delay after skill.
- Increases damage from 6500%/9500%(demihuman and dragon race)Atk to 13000%/14500%(demihuman and dragon race)Atk based on level 10.

* Shadow Exceed
- Removes 1 second delay after skill.
- Reduces AP consumption from 150 to 125 based on level 10.
- Increases duration from 240 seconds to 300 seconds based on level 10.

* Added POW ratio for SHC_SAVAGE_IMPACT with SC_SHADOW_EXCEED
2023-07-28 16:18:06 +02:00
Vietlubu
9e17fa776c Update combo Victory_Wing_Ear_ with Convertible (#7837)
Add Joy - Lens - Bat Enchant

Update Joy_Of_Victory
Refer: https://ro.gnjoy.com/news/probability/View.asp?category=6&seq=4025577&curpage=1

Add Lens_Craft_Stone enchant
Refer: https://ro.gnjoy.com/news/probability/View.asp?category=6&seq=4111812&curpage=1

Add Overclocker enchant
Refer: https://ro.gnjoy.com/news/probability/View.asp?category=6&seq=4071221&curpage=2
2023-07-24 16:03:44 +02:00
Ahmed Shawky
9ddd26f1e2 Corrected an Illusion investigation NPC name (#7851) 2023-07-24 15:54:06 +02:00
amirkhaki
b3741bbd3c Update README.md (#7849)
* Fixes C++ reference.
2023-07-19 12:25:58 -04:00
idk-whoami
fe4234cd39 Corrected script for some item #21 (#7830)
Thanks to @Atemo
2023-07-11 15:50:29 +02:00
eppc0330
c979ed7472 NPC_MAGICMIRROR damage type (#7480)
* The damage type reflected by NPC_MAGICMIRROR is now special melee weapon damage.
* Skill damage reflected by NPC_MAGICMIRROR is now able to trigger autospell.
* Kyomu will block NPC_MAGICMIRROR reflecting ability.
* Calculation of reducing reflect damage now additive, not multiplicative.
2023-07-10 09:51:32 -04:00
eppc0330
511c337ee3 Fix multi-hit skills priority (#7829) 2023-07-09 16:26:29 -07:00
Aleos
70d9f118d8 Revert "Adds buy/sell safety check for Market Shops" (#7839) 2023-07-05 13:19:04 -04:00
aleos
4cb368cdb1 Merge branch 'hotfix/marketshop_sell' 2023-07-05 13:15:59 -04:00
Lemon
5860524bdd fix(docs): fixed wrong effect description (#7838) 2023-07-04 19:18:48 -07:00
Jittapan Pluemsumran
458a9d8950 Fixed potential crash in RODex (#7833) 2023-07-03 19:39:54 -07:00
Vincent Stumpf
f20f8b01be Fix maximum ratio for MOB_ITEM_RATIO_DB (#7836)
Fixes #7835
2023-07-03 19:19:18 -07:00
Atemo
e304472638 Initial release of Illusion of Twins (#7524)
Thanks to @Lemongrass3110 !
2023-07-03 21:32:19 +02:00
Atemo
fbd0478864 Illusion of underwater daily quests (#7834)
* Fixed logic when the quests were in cooldown
2023-07-01 15:02:10 +02:00
Jittapan Pluemsumran
b6d6f09fd7 Fixed wrong index check in clif_parse_laphine_synthesis (#7832) 2023-06-28 16:14:47 +02:00
Lemongrass3110
89dbf89830 Divine Pride Monster Sync 2023-06-26 19:46:18 +02:00
idk-whoami
2ba2473489 Corrected script for some item #20 (#7818) 2023-06-21 19:43:35 +02:00
Pokye
f6d9acdd69 Old Card Album and Mystical Card Album Update (#7820)
Fixed #7730
2023-06-21 18:38:37 +02:00
Kanin Temsrisuk
f79419687a Fixed items script bonus typo / wrong location (#7824) 2023-06-21 17:20:08 +02:00
Vincent Stumpf
d6ba042e1e Upgrade yaml-cpp to remove warning (#7825) 2023-06-18 22:39:49 -07:00
Vincent Stumpf
711705df10 Upgrade to C++17 (#7811)
* Upgrade to C++17
2023-06-16 20:07:23 -07:00
Vincent Stumpf
833966f47b Convert guild_db to unordered_map (#7612)
* Refactor guild db to STL container

* Split up struct guild and MapGuild/CharGuild
2023-06-16 19:42:55 -07:00
mazvi
39cdaa6b84 Fixes produce item requirements (#7814)
* Corrects the produce item requirements for Rough Wind, Great Nature, Earth Elemental Converter, and Wind Elemental Converter.
2023-06-16 13:41:24 -04:00
Aleos
b331958381 Adds option to set item buy/sell values to 0 (#7808)
* Fixes #7790.
* Arrows and Traps are now sold for 0 Zeny to shops.
* Adjusts the item database loadingFinished check to now accept 0 as a valid value for buy/sell and not attempt to adjust the buy/sell value when only one is defined.
Thanks to @Atemo and @mazvi!
Co-authored-by: Vincent Stumpf <vincents.995@gmail.com>
2023-06-16 13:24:07 -04:00
Pokye
cfac5bb769 Added Missing Recall Skills (#7815) 2023-06-16 13:07:32 -04:00
Atemo
8d7239d1a4 Initial release of illusion investigation quests (#7813) 2023-06-13 16:50:59 +02:00
Aleos
c1a52490b1 Resolves an issue with RENEWAL_ASPD (#6959)
* Fixes #6900.
* Resolves an issue where if RENEWAL was enabled but RENEWAL_ASPD was disabled, players would receive incorrect ASPD values.
* Split the ASPD values to their own files so these can be overridden based on the macro defines.
Thanks to @jamesonfajardo and @bgamez23!
Co-authored-by: Vincent Stumpf <vincents.995@gmail.com>
2023-06-12 09:28:38 -04:00
Aleos
33d20fa91a Resolves movable skill unit stack (#7435)
* Resolves movable skill unit stack
* Fixes #1270.
* Resolves an issue where movable skill units, such as Guild Skills, would stack on cells and not properly clear on an object's death.
* Increases the limit from 20 to size_t.
Thanks to @RadianFord and @gidzdlcrz!

* Minor reversions
* Set back to global array rather than scoping it to unit_data.
* Adjusted array to vector so it's large enough to handle a bigger stack.

Thanks to @vstumpf!
2023-06-12 00:35:11 -07:00
Kanin Temsrisuk
8fd752f9cd Fix wrong bow location (#7809) 2023-06-10 15:05:16 +02:00
idk-whoami
83ef1e72c2 Corrected script for some item #19 (#7786) 2023-06-10 15:02:30 +02:00
Atemo
aa8f501388 Added atcommand "setcard" (#7804)
Thanks to @aleos89 and @Lemongrass3110 !
2023-06-08 20:08:26 +02:00
Atemo
38d335a267 Added more information for atcommand refine (#7803) 2023-06-08 14:01:43 +02:00
Aleos
5b832de199 Minor cleanup to mapflags (#7782)
* Adds missing documentation for mf_norodex.
* Updates atcommand mapflag to display information on some missing mapflags.
* Removes "Other Flags2" and combine list with "Other Flags" for atcommand mapflag.
2023-06-07 10:11:32 -04:00
Vincent Stumpf
e5ec2b2ef8 Fix issue with bonus3 bAddEffOnSkill (#7805) 2023-06-06 18:23:37 -07:00
aleos
5339b455c0 Fixes Para Market Jewel seller prices 2023-06-06 10:58:49 -04:00
Lemongrass3110
6f5706a945 Added support for really big cashshops (#7763)
Added some malloc reporting
Forward socket allocation information
Forward WFIFOHEAD allocation information
Cleanup to clif_cashshop_show
Cleanup to clif_cashshop_result
Cleanup to clif_cashshop_list

Fixes #7757

Thanks to @ChiesaV
2023-06-04 21:36:48 +02:00
mazvi
e7ac2b26dd Small update of Illusion of Underwater (#7800)
* Added the old coordinates (commented) of the npc "Jerrymon"
2023-06-04 20:56:49 +02:00
Singe Horizontal
75faf9ac1a Fixes npc last path caching (#7769)
Fixes #7766
2023-06-03 19:56:04 -07:00
Vincent Stumpf
08a1c41d1b Refactor MapFlag accessors (#7783)
Use methods instead of direct member access.
2023-06-03 17:38:29 -07:00
aleos
8073c3026a Adds buy/sell safety check for Market Shops
* Adds a buy and sell safety check from the Market Shop type.
* Also includes an item validation check when loading items from SQL for Market Shops.
Thanks to @mazvi!
2023-06-02 15:41:49 -04:00
Aleos
2c61b336bc Fixes Lux Anima status not applying (#7796)
* Fixes #7793.
* Follow up to 7913eda.
* Adds missing sc_start after cleaning up previous check.
Thanks to @mazvi!
2023-06-02 15:00:36 -04:00
eppc0330
466722b25e Simplify GC_POISONREACT counter formula (#7795)
* Cleanup of #5805.
Co-authored-by: Atemo <Atemo@users.noreply.github.com>
2023-06-02 14:59:40 -04:00
Aleos
4c9280728a Fixes a party check for Weekend Dungeon (#7797)
* Fixes #7776.
* Adjusts the party checks to account for leader versus member.
Thanks to @grimexile and @Atemo!
2023-06-02 14:57:20 -04:00
mazvi
8e56967c83 Fix minor typo in Illusion of Underwater (#7791)
* Resolves an issue with the Gatekeeper sending the player to the wrong menu option.
2023-06-02 14:16:54 -04:00
Aleos
7913eda1e6 Fixes Lux Anima applying Giant Growth (#7792)
* Adds a missing break which was resulting in Lux Anima attempting to cast the Giant Growth Rune.
* This is in conjunction with the revamp of this skill not applying other Runes effects anymore.
2023-06-01 15:15:27 -04:00
Atemo
251cfa2c9c Implemented new items up to may 17 2023 (#7767)
* Implemented new items up to may 17 2023
* Added base data for 1st floor biosphere map
2023-05-28 16:55:53 +02:00
Aleos
fab88ecd04 Follow up to ba86a76 (#7784)
* Fixes #7770.
* Follow up to ba86a76.
* Adds a missing cap rate option for bSkillCooldown which wouldn't allow addition/reduction more than 10000 milliseconds.
Thanks to @attackjom and @sonniez!
2023-05-26 12:45:57 -04:00
Daegaladh
8c059b5b2e Updated the Spanish translation of map-server messages (#7785)
Thanks to @Artuvazro for his suggestions and review
2023-05-26 17:20:05 +02:00
Aleos
fc27b45d9f Resolves inverted checks for Rebirth Spirit (#7780)
* Fixes #7779.
* Skill should be usable on all 1-1 rebirth classes that are below level 70.
Thanks to @XanKriegor1 and @Lemongrass3110!
2023-05-23 22:50:16 -04:00
Kanin Temsrisuk
ecf0174a55 Fix typo and empty mob drop (#7775) 2023-05-23 22:18:16 -04:00
Pokye
9907721a69 Added a mapflag to block BANK (#7773) 2023-05-22 12:23:46 -04:00
Stolao
ccd7e5c14a Added debug output to navi.cpp (#7765)
Add Loading info to write_npc_distances() for resolving potential halts
2023-05-17 14:20:10 +02:00
SapitoSucio
7c18321138 Enabling EPOLL in cmake command (#7764) 2023-05-17 14:19:06 +02:00
Lemongrass3110
5443d566a7 Always trigger CI on CMakeList changes
Thanks to @secretdataz
2023-05-17 11:06:19 +02:00
Lemongrass3110
a4a8e58ba1 Little cleanup of skill_additional_effect (#7762)
Fixes #7759

Thanks to @grimexile
2023-05-16 18:42:19 +02:00
Singe Horizontal
8fd3e2d5e2 Fixed a cant.attack bypass (#7753)
Fixed a pointer being always null

Fixes #7743

Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2023-05-16 16:17:28 +02:00
Aleos
af28882a6f Removes player item bonus rate cap warnings (#7754)
* Removes all of the warnings that were displayed when players had item bonuses that eventually reached the min/max rate.
* The rate is already capped so the warning was just a redundant message that could spam the console.
2023-05-16 10:16:49 -04:00
Vincent Stumpf
016e3570aa Fix incorrect script constants (#7758) 2023-05-15 11:19:53 -07:00
Atemo
fcf0b5d821 Corrected NPC Count when reloading scripts (#7756)
Fixed #7691

Thanks to @Akkarinage
2023-05-13 19:01:48 +02:00
Atemo
b4b69a2cc1 Fixed an issue where mobs instantly walked after being spotted (#7738)
* Fixed an issue where mobs instantly walked after being spotted
  MIN_RANDOMWALKTIME was initialized too early
* This behavior is only applied on the monster script command
2023-05-12 00:34:36 +02:00
Jittapan Pluemsumran
d3b99e6dc1 Fixed market response packet when purchase fails (#7751)
The item list was still sent to the client even when the purchase failed because p->result is no longer 0 in PACKETVER >= 20190807.
2023-05-10 20:44:08 +07:00
mazvi
dfa7e5e084 Rename Upgrade SQL (#7742) 2023-05-03 21:15:53 -04:00
Atemo
84bf6b87f1 Fixed an issue for map_drops.yml (#7735)
The key for umap should be the index, to allow to define the same item in yaml file
2023-04-26 23:35:24 +02:00
Atemo
6308b4feaf Follow-up d7840cd265
Added missing delitem

Thanks to @tumemmac
2023-04-26 22:31:32 +02:00
Atemo
d7840cd265 Einbech dungeon 3 (#7209)
* Implemented dungeons, merchants and quests related to einbech 3

Thanks to @Pokye !
2023-04-26 18:39:24 +02:00
Singe Horizontal
4718d5e813 Added new status flag RequireNoWeapon (#7201)
* Fixes #7200.
* Added new status flag RequireNoWeapon.
2023-04-24 12:01:24 -04:00
Singe Horizontal
b4be3b059a Prevent an uint underflow and reformat array_size occurences in some commands (#7729)
Fixes #7728
2023-04-22 19:42:13 -07:00
Singe Horizontal
9051fc644d Corrected NPC_DARKBREATH formula (#7285)
* Corrected NPC_DARKBREATH formula
Fixes #7284

* Update src/map/battle.cpp

Co-authored-by: Pokye <98105181+Pokye@users.noreply.github.com>

* Update src/map/battle.cpp

Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>

* Added renewal logic

* now uses only one formula for both modes

---------

Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
Co-authored-by: Pokye <98105181+Pokye@users.noreply.github.com>
2023-04-20 10:13:37 +02:00
Singe Horizontal
9df8f9f113 Corrects a short-circuit bug in status_change_clear_buffs (#7724)
Fixes #7723
2023-04-19 15:55:44 -07:00
idk-whoami
ea65c1b9ba ViewID correction of item IDs 20765 (#7720)
Fixed #7697 

Thanks to @llchrisll
2023-04-18 17:17:31 +02:00
Lemongrass3110
339adbbe2d Fixes the pincode system (#7719)
Fixes #7700

Thanks to @24msz6eo, @Melk3000 and @vstumpf
2023-04-17 18:20:15 +02:00
Vincent Stumpf
579dea8fad Add debug logs for debugging client connections (#7701) 2023-04-16 22:47:06 -07:00
Atemo
665eb969ed Corrected animation of the skill SHC_SAVAGE_IMPACT (#7717)
* Fixed an issue where the client did not update the position of the player
* Additionally fixed the player direction when the player casts the skill while being on the same cell of the target
2023-04-16 22:59:19 +02:00
Atemo
939567d361 Fixed an issue with cloak*npc (#7715)
* all the npcs saved in pc should be removed on map change
2023-04-16 14:58:47 +02:00
munkrej
635add84d7 4th Improvement - Troubadour & Trouvere (#7703) 2023-04-16 00:38:19 +02:00
munkrej
5385584f6f 4th Improvement - Wind Hawk (#7704) 2023-04-15 23:37:19 +02:00
munkrej
16195cea2a 4th Improvement - Inquisitor (#7705) 2023-04-15 23:36:30 +02:00
munkrej
a818232e77 4th Improvement - Cardinal (#7706) 2023-04-15 23:16:26 +02:00
munkrej
741dfe37ae 4th Improvement - Elemental Master (#7707) 2023-04-15 22:52:20 +02:00
munkrej
e4acd6e5dc 4th Improvement - Arch Mage (#7708) 2023-04-15 22:52:03 +02:00
munkrej
452238b523 4th Improvement - Abyss Chaser (#7709) 2023-04-15 18:45:51 +02:00
munkrej
6c8b29e91b 4th Improvement - Shadow Cross (#7710) 2023-04-15 17:46:18 +02:00
munkrej
287501d665 4th Improvement - Biolo (#7711) 2023-04-15 17:43:30 +02:00
munkrej
e1e19a6d06 4th Improvement - Meister (#7712) 2023-04-15 17:31:19 +02:00
munkrej
382d6bf54a 4th Improvement - Imperial Guard (#7713) 2023-04-15 16:53:39 +02:00
munkrej
e40c3edc31 4th Improvement - Dragon Knight (#7714) 2023-04-15 16:04:59 +02:00
Vincent Stumpf
a2f4f2bf8e Do not call pet_set_intimate twice (#7702) 2023-04-15 15:02:41 +02:00
munkrej
22aca36d35 Adds enchantgrade chance per refine (#7608)
Fixes #7607

Co-authored-by: Aleos <aleos89@users.noreply.github.com>
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2023-04-14 23:43:33 +02:00
Lemongrass3110
18ec884ba8 Removed a duplicate function call in erasequest
Thanks to @Pokye
2023-04-12 22:33:21 +02:00
Everade
7853e926c2 Episode 17.2 - Sage's Legacy (#6799)
* Episode 17.2 Initial Release of instances and quests
* Added warp portals and monster spawn scripts
* Added Episode 17.2 related database entries

Closed #6470 

Thanks to @Megelith @Pokye 

Co-authored-by: JohnnyPlayy <JohnnyPlayy@users.noreply.github.com>
Co-authored-by: Everade <privacy@gatheringro.com>
Co-authored-by: crazyarashi <26841779+crazy-arashi@users.noreply.github.com>
Co-authored-by: Atemo <capucrath@gmail.com>
2023-04-12 21:27:34 +02:00
Atemo
c7b464b91f Initial release of Illusion of underwater (#7521)
Implemented the main quest, daily quests and exchange npcs related to illusion of underwater.
Walkthrough Conversion.

Closed #6472 

Thanks to @secretdataz @OptimusM !

Co-authored-by: aleos <aleos89@users.noreply.github.com>
2023-04-12 20:20:23 +02:00
Atemo
0413d0e85c Initial release of Illusion of Luanda (#7559)
* Implemented the main quest, daily quests and exchange npcs related to Illusion of Luanda.
Fixed #6462 

Co-authored-by: Aleos <aleos89@users.noreply.github.com>
2023-04-12 18:38:26 +02:00
Everade
2a4a82315b Episode 16.2 - Friday Memorial Dungeon (#7300)
* Implementation of Episode 16.2 Friday Memorial Dungeon.

Fixed #6452

Co-authored-by: Atemo <Atemo@users.noreply.github.com>
Co-authored-by: Aleos <aleos89@users.noreply.github.com>
2023-04-12 17:40:53 +02:00
Everade
36a2c9783f Episode 16.1 - Edda Half Moon In The Daylight (#7298)
* Implementation of the Episode 16.1 - Edda Half Moon In The Daylight - Memorial Dungeon (quests and exchange NPCs)

Thanks to @Pokye @OptimusM @idk-whoami !

Co-authored-by: Aleos <aleos89@users.noreply.github.com>
Co-authored-by: Atemo <Atemo@users.noreply.github.com>
2023-04-12 14:03:33 +02:00
Atemo
0fbe8c3ecd Fixed an issue with npc_enable_target (#7695)
Fixed #7694 

Thanks to @eppc0330
2023-04-12 01:50:03 +02:00
Atemo
806c89edb3 Updated the NPC structure (#6923)
* added the possibility to define the state (hidden, cloaked, disabled) of the npc/warp in the npc definition

Thanks to @Daegaladh
2023-04-10 23:53:16 +02:00
Atemo
801c3c782e Updated disablenpc/enablenpc (#7671)
* Updated disablenpc/enablenpc script commands using OPTION_HIDE instead of OPTION_INVISIBLE, to correctly display the effects when the npcs are disabled/enabled. The other behaviors are kept.
2023-04-10 23:06:55 +02:00
Atemo
66c05937b5 Added mag_dun03 quests (#7207)
* Implemented mobs, quests
* Updated MAGMA_ESSENCE and added MAGMA3 option group

Thanks to @Pokye
2023-04-10 17:07:42 +02:00
Vincent Stumpf
ab6c5beaf8 Fix out-of-bounds in TypesafeCachedYamlDatabase (#7690)
Fixes #7664

Thanks to @jofvgaming
2023-04-09 21:49:30 +02:00
Vincent Stumpf
d2e972cfd1 Fix Undeclared HEADER_ZC_SEARCH_STORE_INFO_ACK 2010-08-03 (#7679) 2023-04-09 20:34:52 +02:00
Atemo
c12d5ed6b7 Initial release of Illusion of Turtle (#7465)
* Implemented the main quest, daily quests and exchange npcs related to illusion of turtle
* Implemented the random option groups of the items given in the dungeon

Thanks to :
@attackjom 
@idk-whoami 
@OptimusM 
@Pokye 

Co-authored-by: Aleos <aleos89@users.noreply.github.com>
2023-04-09 20:00:45 +02:00
Atemo
c2f44f5fcb Implemented new items up to april 05 2023 (#7682) 2023-04-08 17:32:49 +02:00
Atemo
74b2834502 Updates map_drops.yml (#7676)
* adjusted the rate in map_drops.yml to 1/100000 instead of 1/10000

Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2023-04-08 16:48:01 +02:00
eppc0330
8a4b34ef6a Fix NPC_DAMAGE_HEAL heal calculation (#7660)
Fix NPC_DAMAGE_HEAL heal amount not being applied from some SC bonuses
2023-04-08 15:42:09 +02:00
Austin Wang
cf0264be45 Fix some items' names for Alberta stylish npc (#7666)
Co-authored-by: Jittapan Pluemsumran <nightsheep@outlook.com>
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2023-04-08 14:39:26 +02:00
Atemo
370ee1e876 Added amicitia1 and amicitia2, dungeons level 200 (#7336)
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>

Thanks to @OptimusM !
2023-04-07 15:42:55 +02:00
Atemo
b7807db42f Implemented NPC_GROUNDDRIVE (#7677) 2023-04-07 14:56:08 +02:00
Atemo
db5874d677 Updated unitskilluseid and unitskillusepos script commands (#7684)
* Added the parameter 'ignore_range' to ignore the skill range defined in skill_db.yml
2023-04-07 01:09:44 +02:00
Atemo
fff69b0cfd Added missing combo Phreeoni_Wing_Suits + Phreeoni_Egg (#7680)
Fixed #7393

Thanks to @eppc0330
2023-04-07 01:05:43 +02:00
Atemo
6136f7df35 Updated achievement_db.yml (#7681) 2023-04-06 15:46:20 +02:00
Atemo
1a5072c153 Added new maps up to April 05 2023 (#7683) 2023-04-06 14:54:07 +02:00
Aleos
65200eba50 Fixes an issue with clones receiving 1 damage (#7670)
* Fixes #7579.
* Adds an extra conditional check for reducing Green Aura type mobs to ignore cloned monsters.
Thanks to @vietlubu and @Lemongrass3110!
2023-04-03 18:47:53 -04:00
idk-whoami
70736c9b1d Corrected script for some item #18 (#7644)
Thanks to @Atemo
2023-04-03 14:40:52 +02:00
Atemo
d031afe364 Implemented the skill NPC_RAINOFMETEOR (#7675) 2023-04-02 21:30:08 +02:00
Atemo
81b62348b7 Implemented the skills NPC_RELIEVE_ON and NPC_RELIEVE_OFF (#7614)
* Implemented the skills NPC_RELIEVE_ON and NPC_RELIEVE_OFF as part of episode 17.2

Thanks to @aleos89 !
2023-03-31 19:52:35 +02:00
Atemo
eff3b2014b Removed NoForcedEnd for SC_MONSTER_TRANSFORM (#7655) 2023-03-31 15:12:06 +02:00
Atemo
c06fed6b56 DB update - Aegis item name (#7661)
* Updated several Aegis item names DB
2023-03-28 14:48:25 +02:00
Atemo
f8c5cd9552 Small correction on the attribute table (#7662)
Follow-up e4e8063ec3

* Defense Wind and Fire values have been reversed for Undead weapon element.
* There should be no negative defense according to the official tables.

Thanks to @vstumpf
2023-03-25 14:13:45 +01:00
Atemo
6673e1a786 Fixed an issue where normal NPC had no sprite when walking (#7652)
* Fixed an issue where normal NPC had no sprite when walking
* Added a note

Thannks to @vstumpf
2023-03-24 15:28:50 +01:00
Lemongrass3110
49ba072f3a Added returning to instances (#7622)
Fixes #5226

Thanks to @Forte22, @attackjom and @OptimusM

Co-authored-by: Aleos <aleos89@users.noreply.github.com>
2023-03-23 15:49:39 +01:00
Vincent Stumpf
8abf9960a0 Fix memory leak on map quit (#7657) 2023-03-23 12:11:15 +01:00
Vincent Stumpf
f0e374ea23 Fixes getrefine failing in OnEquip/OnUnequip scripts (#7592) 2023-03-20 10:08:04 -07:00
Vincent Stumpf
819b7cb361 Fix ASAN crashes and LSAN leaks (#7649) 2023-03-20 09:32:41 -07:00
Lemongrass3110
4d9b1a0b83 Deduplicate strlib code (#7651)
Follow up to 4e64623
2023-03-19 21:07:16 +01:00
Atemo
1ccdc17df5 Added some entries in instance_db.yml (#7654)
* Added some entries in instance_db.yml
2023-03-19 20:24:00 +01:00
Lemongrass3110
b95daa3041 Fixed wrong node usage for instance loading
Noticed because of #7654
2023-03-19 19:10:42 +01:00
Atemo
36972bf9ea Corrected the english name of several items in item DB (#7653) 2023-03-19 17:51:31 +01:00
Vincent Stumpf
4e646235d2 Fix builds that don't use the memory manager (#7648) 2023-03-18 23:57:44 -07:00
Jittapan Pluemsumran
b4f740ce18 Added a config for banking state check (#7646)
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2023-03-16 20:24:13 +07:00
Atemo
19bbd82c55 Initial release of nif_dun quests (#7349)
* Added mobs db, mobs spawn and quests related to nif_dun01 and nif_dun02
* Some data after rebalance is missing but the base is there

Thanks to @aleos89 @Lemongrass3110 @Pokye @OptimusM @Tokeiburu for the reviews !
2023-03-16 13:24:32 +01:00
eppc0330
067c21b647 Implement NPC_DAMAGE_HEAL and NPC_IMMUNE_PROPERTY (#7638)
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2023-03-15 21:36:47 +01:00
Jittapan Pluemsumran
22abdf8dbe Added missing state checks in banking functions (#7645)
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2023-03-14 17:34:05 +07:00
Vincent Stumpf
7dd6eb5182 Add other player in mail transactions (#7568)
* Add other player's char_id in mail transactions

Thanks to @tokeiburu

Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2023-03-14 02:30:23 -07:00
munkrej
cbb5380527 Adds skill NPC_KILLING_AURA (#7624) 2023-03-14 00:14:41 +01:00
Lemongrass3110
ae2ea3df10 Implemented NPC_WIDELEASH (#7643) 2023-03-13 22:46:23 +01:00
Lemongrass3110
6ff1ebfa98 Implemented NPC_LEASH (#7642) 2023-03-13 21:36:50 +01:00
Atemo
3f45df1025 Added news items - equipments up to 03022023 (#7625) 2023-03-13 13:50:21 +01:00
eppc0330
eb875d1af5 Implement NPC_MOVE_COORDINATE (#7636) 2023-03-13 06:55:50 +01:00
eppc0330
bee2c27d78 Implement NPC_ALL_STAT_DOWN (#7637) 2023-03-13 06:25:02 +01:00
eppc0330
b3881bd1fc Implement NPC_GRADUAL_GRAVITY (#7635) 2023-03-13 00:25:47 +01:00
Vincent Stumpf
1c35482ecf Change copied bl type to BL_NUL for delayed clif_clearunit (#7640)
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2023-03-12 12:38:47 -07:00
idk-whoami
3998f7ed75 Corrected script for some item #17 (#7616)
Thanks to @Atemo
2023-03-08 15:10:50 +01:00
Vincent Stumpf
8f4a1d2932 Remove relative includes for 3rdparty imports (#7609)
This also changes the imports for config, custom to use the src include path
2023-03-07 16:21:28 -08:00
Vincent Stumpf
1b1164f91d Change memcpy for safestrncpy for char * (#7629) 2023-03-06 09:53:23 -08:00
Vincent Stumpf
6a0b7afd88 Fix possible out of bounds (#7630) 2023-03-06 09:37:26 -08:00
aoshfan
bb8c4a03c8 Fix Fire Pillar skill to not consume Gemstone if VIP or use Mistress card (#7623) 2023-03-05 17:04:24 -08:00
userid0
b22e186e77 Cleanup homun txt in map-server-generator (#7627) 2023-03-04 18:44:18 +01:00
idk-whoami
b56f11207c Update warper npc (#7617) 2023-02-28 19:48:34 +01:00
Lemongrass3110
839d378680 Added missing breaks to instance_warpall 2023-02-26 22:37:07 +01:00
Jittapan Pluemsumran
1985662045 Made debug ShowStatus calls easier to disable (#7618)
Co-authored-by: Aleos <aleos89@users.noreply.github.com>
2023-02-21 11:34:52 +07:00
Atemo
08d3467faa Updated item names and fix an issue with ignore_res_by_race / ignore_mres_by_race (#7613) 2023-02-16 22:41:15 +01:00
Aleos
240f71cbce Converts Homunculus Database to YAML (#4659)
* Converts the Homunculus Database and Homunculus Skill Tree Database into one YAML flat file.
* General cleanups and optimizations.
* Includes CSV2YAML converter.
Thanks to @Lemongrass3110 and @Atemo!
Co-authored-by: Atemo <capucrath@gmail.com>
2023-02-15 14:42:51 -05:00
Atemo
b2ceb30e30 Added missing items equipment up to 02/10/2023 (#7606)
* Added missing items equipment up to 02/10/2023
* Implemented the item bonuses bIgnoreResRaceRate and bIgnoreMResRaceRate

Thanks to @attackjom for the review!
2023-02-15 16:15:11 +01:00
Vincent Stumpf
a35063dfd6 Upgrade to c++14 (#7593) 2023-02-13 10:58:31 -08:00
Everade
56ae2174c0 Episode 16.2 - Weekend Memorial Dungeon (#7299)
* Implementation of Episode 16.2 Weekend Memorial Dungeon.

Co-authored-by: Aleos <aleos89@users.noreply.github.com>
2023-02-13 14:25:52 +01:00
munkrej
c6c9babb5e Homunculus updates as of 20220602 (#7586)
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2023-02-12 23:55:13 +01:00
Lemongrass3110
42d8c163b7 Added missing columns for yaml2sql (#7603)
Fixes #7602

Thanks to @Triedge
2023-02-12 23:04:46 +01:00
Vincent Stumpf
9d2bcc7a70 Change npc_src_files linked list to vector (#7598) 2023-02-12 13:38:12 -08:00
Vincent Stumpf
e235c9cab4 Change common and config includes to use <> (#7596) 2023-02-12 12:46:06 -08:00
Vincent Stumpf
eff6131087 Speed up loading of npcs and maps (#7597) 2023-02-12 11:01:14 -08:00
Atemo
bc7b9cdd2e Updated instance_warpall script command (#7591)
* Added a parameter to the instance_warpall script command to prevent dead players from being warped

Thanks to @aleos89, @Lemongrass3110 and @vstumpf for the reviews!
2023-02-12 16:09:20 +01:00
idk-whoami
36bcfaecee Corrected script for some items #16 (#7583)
Thanks to @Atemo
2023-02-12 15:33:11 +01:00
Lemongrass3110
98b3f2af52 Removed some useless strlib functions (#7600)
* Removed jstrescape

* Removed jstrescapecpy

* Removed jmemescapecpy

* Removed J_MAX_MALLOC_SIZE

* Removed trim2
2023-02-12 13:08:24 +01:00
Vincent Stumpf
7629ff4032 Speed up loading CachedYamlDBs (#7599)
Instead of iterating from the end to find the last item in the cache, just store the highest key we've found.
Then, resize the cache to that
2023-02-12 00:20:54 -08:00
Vincent Stumpf
ce8f053359 Speed up YAML DB loading by removing ShowStatus (#7595) 2023-02-10 16:04:35 -08:00
idk-whoami
56af701ade Corrected script for some item #15 (#7566)
Thanks to @Atemo
2023-02-10 15:14:26 +01:00
Vincent Stumpf
08e9af48fe Add on-demand triggers for workflows (#7594) 2023-02-09 19:53:29 -08:00
Vincent Stumpf
6938722f02 Replace the bitshift optimizations for multiplication (#7590)
* These were originally bitshifts because it was 'faster', but now with modern compilers and hardware, the only thing it does now is confuse developers who have to read the code
2023-02-08 16:00:11 -08:00
Lemongrass3110
7313495185 Fixed MariaDB compilation
Follow up to da73084

Thanks to @SapitoSucio and @Singe-Horizontal
2023-02-09 00:27:15 +01:00
Lemongrass3110
da73084df5 Forcefully disable SSL for MySQL (#7588) 2023-02-08 21:13:09 +01:00
Aleos
46eaa8ddf0 Updates the readme badges (#7589)
* Removes old LGTM badges.
* Adds new badges for each of the different build types.
* Adds badge for commits per week.
2023-02-08 13:32:07 -05:00
Lemongrass3110
f261307bbe Added script command mesitemlink (#7565)
Adds a new script command for itemlink generation for usage inside NPC dialogs (mes "").
A few cleanups related to the normal itemlink feature.

Thanks to @Atemo and @aleos89 for their help!

Co-authored-by: Atemo <Atemo@users.noreply.github.com>
Co-authored-by: Aleos <aleos89@users.noreply.github.com>
2023-02-07 10:47:36 +01:00
Lemongrass3110
59a722234d Fix compilation on Mac M1 (#7582)
Fixes #7557

Thanks to @vietlubu
2023-02-07 09:23:33 +01:00
Lemongrass3110
ba32ccc928 Added two missing timer function names 2023-02-07 00:18:57 +01:00
Lemongrass3110
115522e1fd Fixed some warnings related to dynamic NPCs
Fixes #7417

Thanks to @idk-whoami and everyone else who reported it.
2023-02-06 23:21:36 +01:00
idk-whoami
1fda953e62 Added missing mob AI IDs 3794 ILL_ICE_TITAN (#7580) 2023-02-06 21:05:51 +01:00
Vietlubu
913bcfe6fb Hero weapon LT enchant (#7576)
Add laphine upgrade for Patent and LT weapon
Correction ANCIENT_HERO_WISDOM enchant options

Fixes #7575
2023-02-06 20:14:37 +01:00
idk-whoami
96f0f77d42 Hat Effect Update (#7569) 2023-02-03 09:54:27 +01:00
Dominik Nussbaumer
e2ee5cbefb hide functions for yaml2sql (#7390)
yaml2sql uses some headers for constants from map-server.
In order to avoid linker errros, no functions from those headers
must be used.
However, some static functions are the status.hpp which cause
linker errors when creating a debug build.
The define `ONLY_CONSTANTS` hides those funcitons for yaml2sql.

refs #7389

Co-authored-by: Vincent Stumpf <vincents.995@gmail.com>
2023-02-02 23:51:46 -08:00
Henrybk
a1f9a6c1d1 Fix item 15906 Northern_Cross (#7573)
Adjust "Recovers 30 HP and 3 SP" to "Recovers 30 HP and 3 SP per refine rate".
2023-02-01 19:16:20 +01:00
Atemo
d93d4144eb Glast Heim Abyss dungeon (#7474)
* Added related quests
* Added monsters spawn
* Added related random option groups

Credit goes to @OptimusM !
Thanks to @aleos89 for the review !
2023-01-26 16:39:12 +01:00
Livia Medeiros
7c4b9fa179 Fix typos in Renewal scripts (#7567) 2023-01-26 07:43:26 -05:00
Atemo
39559c125b Implemented missing skills (#7552)
* Implemented NPC_BLEEDING2
  Copy from NPC_BLEEDING for now except
  * element always Neutral
  * differents rates

* Implemented NPC_HELLJUDGEMENT2
  Copy from NPC_HELLJUDGEMENT except
  * element neutral
  * skills inflicts a random status effect

* Implemented NPC_WIDEFREEZE2
  Copy from NPC_WIDEFREEZE

* Implemented NPC_ICEBREATH2
  Copy from NPC_ICEBREATH except
  * Chance 100% instead of 70%
  * Splash area 4 instead of 3

* Implemented NPC_WIDEBLEEDING2
  Copy from NPC_WIDEBLEEDING

* Implemented NPC_WIDECONFUSE2
  Copy from NPC_WIDECONFUSE

* Implemented NPC_WIDESILENCE2
  Copy from NPC_WIDESILENCE

* Implemented NPC_WIDESTUN2
  Copy from NPC_WIDESTUN

* Implemented NPC_WIDESILENCE2
  Copy from NPC_WIDESILENCE

* Implemented NPC_WIDESLEEP2
  Copy from NPC_WIDESLEEP

* Implemented NPC_WIDECURSE2
  Copy from NPC_WIDECURSE

* Implemented NPC_WIDESTONE2
  Copy from NPC_WIDESTONE

Thanks to @OptimusM, @Lemongrass3110, @aleos89 !
2023-01-24 15:06:38 +01:00
Lemon
7e62670882 Improved itemlink logic (#7532)
Fixed tags and separators for various packet versions.

If itemlink is disabled it will output the item name with the refine as prefix and the slots as suffix (if equipment)
It will also append [0] if the item is an equipment and has 0 slots (to make it easier to tell from non-equipment items)

Disabled feature on packet versions older than 2015-11-04 until proven otherwise

Fixes #7441

Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2023-01-23 10:49:18 +01:00
Lemongrass3110
f4ad5045a5 Fixed autotrading re-login
Fixes #7556

Thanks to @datawulf, @mazvi, @attackjom and @zdurexz
2023-01-23 10:03:24 +01:00
Livia Medeiros
b6c7890763 Fix typos in Renewal scripts (#7563) 2023-01-23 09:34:02 +01:00
Jittapan Pluemsumran
b4a8fdce13 Fixed instances with infinite timeout getting destroyed instantly (#7554) 2023-01-20 20:47:23 +07:00
Atemo
b40469f881 Initial release of Illusion of Frozen (#7464)
* Implemented the main quest, daily quests and exchange npcs related to illusion of frozen (Walkthrough Conversion)
2023-01-19 16:54:22 +01:00
Atemo
7acdcd391c Corrected the logic for Juno quest in ve_fild04 (#7551)
Thanks to @eleriaqueen @mazvi @Lemongrass3110 @idk-whoami !
2023-01-19 15:04:57 +01:00
idk-whoami
d91f3b7a51 Updated the item database #14 (#7555)
* Corrected and implemented some item

Thanks to @Atemo
2023-01-18 23:14:43 +01:00
Pokye
8f1450b178 Updated item db (#7553)
* Added several items from bRO in item database
2023-01-18 21:14:36 +01:00
Atemo
65ebbdc992 Added NPCs in rgsr_in (#7488)
* Added missing NPCs in rgsr_in (used for item reform, enchant)
* Attempt to clean up some dialog
* Added Group_0 in item_randomopt_group.yml (apply no randomoption)

Thanks to @Dia !

Co-authored-by: aleos <aleos89@users.noreply.github.com>
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2023-01-14 15:58:06 +01:00
fab10Carvalho
2bcd31b58b Fix NPC_EARTHQUAKE from R001_BESTIA (#7545) 2023-01-13 10:44:09 -05:00
Lemongrass3110
513a4db716 Fixes a critical issue with pointshop (#7549)
Fixes #7548

Thanks to @mazvi
2023-01-13 15:09:14 +01:00
Lemongrass3110
5044776eb7 Added support for map selection (#7546)
Fixes #6632

Thanks to @Xypr0, @Toshiro90, @alisonrag and @aleos89
2023-01-11 22:42:54 +01:00
Aleos
3464292a31 Fixes instances with infinite duration (#7547)
* Fixes #6230 and fixes #7472.
* Resolves an issue where instances that have infinite TimeLimit or IdleTimeOut would instantly become destroyed.
* Fixes an issue where do_final_instance() could end up on an invalid iterator value resulting in memleaks/crashes on map server closure.
* Add missing constructor parameters.
Thanks to @secretdataz, @Lemongrass3110, and @mazvi!
2023-01-11 14:25:11 -05:00
Lemongrass3110
14cb61d598 Removed mapindex from char-server (#7533)
Converted last_point to mapname
Converted save_point to mapname
Converted memo to mapname
Converted start point to mapname
Removed default map
Converted party member to mapname
Converted maplists to mapname
Removed mapindex loading
Fixed instance loading with multiple map-servers
Fixed castle loading with multiple map-servers
Fixed battleground loading with multiple map-servers
Fixed warping between map-servers

Thanks to @aleos89 for his help!
2023-01-11 16:54:53 +01:00
userid0
cbe2acb786 Fixs cash shop database import (#7544)
fix import vcxproj file name.
2023-01-11 11:24:35 +01:00
mazvi
6ae037bd17 Revert "Open Soda Market After Close Dialog NPC (#7541)" (#7543)
This reverts commit 8df1720f49.
2023-01-10 18:41:35 +01:00
mazvi
8df1720f49 Open Soda Market After Close Dialog NPC (#7541) 2023-01-10 19:07:31 +07:00
Lemongrass3110
913519ed50 Fixed online_char_db (#7539)
Added a missing map entry assignment from an invalid DBMap ensure conversion.

Fixes #7538

Thanks to @MaouDaiou and @zdurexz
2023-01-09 16:09:36 +01:00
Lemongrass3110
e64c5bce35 Fixed item restrictions for noreturn
Fixes #7537

Thanks to @mazvi
2023-01-09 15:12:31 +01:00
Lemongrass3110
4836d8e77a Added latest constants and names 2023-01-06 22:58:50 +01:00
Lemongrass3110
4fb6740ebf Replaced DBMap usage in char-server (#7514)
Co-authored-by: Aleos <aleos89@users.noreply.github.com>
2023-01-06 20:29:01 +01:00
Lemongrass3110
c9aaf540bf Added reloadbarterdb (#7530)
Fixes #7520

Thanks to @attackjom
2023-01-06 00:23:25 +01:00
Balfear
134bfbe986 Added new guild UI features (#6285)
Co-authored-by: Aleos <aleos89@users.noreply.github.com>
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
Co-authored-by: Null Ragnarok Relation <59070443+iberryRO@users.noreply.github.com>
2023-01-05 23:39:30 +01:00
Aleos
7323800838 Fixes shadowing for private variables (#7531)
* Fixes #7508.
* Follow C++ convention for private variable declaration.
Thanks to @Lemongrass3110 and @idk-whoami!
2023-01-05 12:30:39 -05:00
Lemongrass3110
9dda166c0e Converted cash shop database to YAML (#6299)
Co-authored-by: Atemo <Atemo@users.noreply.github.com>
Co-authored-by: Aleos <aleos89@users.noreply.github.com>
2023-01-05 18:30:07 +01:00
Aleos
503b57dbef Add extra validation checks for map coordinates (#7526)
* Add extra validation checks for map coordinates
* Adds some extra validation checks for map coordinates when parsed in YAML.
2023-01-04 14:30:29 -05:00
Atemo
ea3464598d Added support for new maps up to december 21 2022 (#7525) 2023-01-04 15:19:57 +01:00
Jittapan Pluemsumran
857a34832f Prevent opening vending UI multiple times (#6430)
Prevent opening vending UI multiple times in one vending session.
Discard cart modification packet when the player is in a 'can't act' state.

Fixes #3408

Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2023-01-04 15:19:26 +01:00
Atemo
3958a96771 Added sp_rudus4, dungeon level 200 (#7334)
* Added mobs db, mobs spawn and quests related to sp_rudus4

Thanks to @Dieby, @secretdataz !

Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2023-01-03 22:51:34 +01:00
Aleos
b867a2171f Adds char_server config for clearing parties (#7523)
* Adds a character server config to clear empty parties at start up.
* The commented code was hidden in the source and is pretty useless unless you are digging for it.
2023-01-03 16:22:30 -05:00
Atemo
936abe13eb Doc update (#7517)
* Updated the description of instance_id and getitemname script commands
2023-01-03 20:55:55 +01:00
Lemongrass3110
1361e9c1df Enabled conformance mode in MSVS (#7513) 2023-01-03 18:50:16 +01:00
Lemongrass3110
64228cd18f Fixed bAddMonsterDropItemGroup (#7516)
Fixes #7515

Thanks to @AcDczZ
2022-12-30 22:03:55 +01:00
Atemo
d0b51d91a0 Fixed an issue with mail (#7518)
* mail should accept card with ID 0 (no card) when the parameter card is provided
2022-12-29 23:36:55 +01:00
Atemo
fa0253342a Added items etc, combo, equipment (#7507)
Added items Enchant
Added items reform
Small correction of a combo

Thanks to @fab10Carvalho for the review
2022-12-29 02:05:57 +01:00
idk-whoami
323a541074 Item db updated (#7485)
* Implementations + corrections of a bunch of items
2022-12-21 15:12:18 +01:00
Aleos
70d729ecf8 Fixes GitHub Workflow Concurrency flag (#7505)
* Do not cancel master workflow.
2022-12-20 19:53:39 -05:00
Lemongrass3110
39d5a02a31 Initial release of adventure agency (#7224)
Thanks to @Dia, @OptimusM, @Balferian and @ecdarreola
2022-12-21 01:17:42 +01:00
Atemo
3d5cd57c54 Added new etc/equipment/enchant up to december 2022 (#7489)
* Implemented new equipments and etc
* Updated item_enchant.yml

Thanks to @attackjom !
2022-12-21 00:47:23 +01:00
Lemongrass3110
2c4ee64b59 Start refactoring the core to C++ (#7303) 2022-12-20 23:37:31 +01:00
Aleos
ef4d52fd7b Adds official Wand of Hermode clear list (#7494)
* Wand of Hermode has a unique status clear list separate from the list other skills use.
* Adds RemoveOnHermode status flag to identify statuses that can be removed from Wand of Hermode.
Thanks to @mrjnumber1 and @Lemongrass3110!
2022-12-20 17:05:27 -05:00
Lemongrass3110
3bfead228e Additional safeguards for upgrade_20221218.sql
Thanks to @mazvi for his help.
2022-12-20 20:20:05 +01:00
Singe Horizontal
9e476cce31 Fixed specialeffect with npc names (#7502)
Fixes #7501

Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2022-12-20 17:27:59 +01:00
Lemongrass3110
448d8febfa Follow up to 3b71f77
Thanks to @Atemo
2022-12-20 14:09:58 +01:00
Balfear
3b71f77c27 pc_isUseitem: update flywings list (#7487)
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2022-12-20 14:03:59 +01:00
idk-whoami
5b8d0ee6a5 Update EDP requirements (#7463)
Fixes #7458

Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2022-12-19 12:19:30 +01:00
Balfear
9b6a4de288 Roulette: Bonus item reward (#7427)
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
Co-authored-by: Aleos <aleos89@users.noreply.github.com>
2022-12-19 00:15:02 +01:00
Balfear
817b86d5e1 Roulette: Bonus item reward (#7427)
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
Co-authored-by: Aleos <aleos89@users.noreply.github.com>
2022-12-19 00:14:38 +01:00
Atemo
0e948b5f9a Fixed a potential issue with getmapxy (#7498) 2022-12-18 13:15:57 +01:00
Lemongrass3110
eda702ca2c Fixed gaps in random options (#7449)
Fixes #7447

Thanks to @Abszoluto
2022-12-18 02:52:18 +01:00
Lemongrass3110
d1e184e46c Initial version of cashmall (#7450)
Introduces the cashmall
Added Cachua_Coupon exchange NPC
Enabled Devil Enchant Master and moved to Cash Mall
Moved Mergician
Added Basta, Mighty Hammer and Brock
Moved Shadow Blacksmith
Added Cash Hair Stylist
Added a feature switch for Stylist UI
Updated Hair Stylist

Thanks to @aleos89, @Atemo and @eppc0330!

Co-authored-by: aleos <aleos89@users.noreply.github.com>
Co-authored-by: Atemo <Atemo@users.noreply.github.com>
2022-12-18 00:39:50 +01:00
Pokye
ee91ab507a Item DB update (#7451)
* Added Missing Items
* Correction of several item names
* Added missing hateffects
2022-12-17 23:47:54 +01:00
Lemongrass3110
165e0d668f Fixed dynamic NPC timeout (#7497)
Fixes #7473
Updates the last interaction time on end; and close;
Additionally added the official dynamic NPC result packet.

Thanks to @eppc0330
2022-12-17 22:33:19 +01:00
idk-whoami
93cf18736a Update warper npc (#7413)
* Updated and added new warps entries up to episode 19
2022-12-17 14:15:02 +01:00
Atemo
b862aed75c Small correction for SHC_SAVAGE_IMPACT and SHC_DANCING_KNIFE skills (#7496)
* Small correction for SHC_SAVAGE_IMPACT and SHC_DANCING_KNIFE skills
* SHC_SAVAGE_IMPACT should move the player from 1 cell to the target, between the target and the player
* SHC_DANCING_KNIFE shouldn't force the player to stand
* The behaviour should be the same for GC_CROSSIMPACT than SHC_SAVAGE_IMPACT

Thanks to @aleos89 @Lemongrass3110 !
2022-12-17 14:08:09 +01:00
Lemongrass3110
ae686056a0 Added CodeQL analysis (#7208)
Adds CodeQL analysis because LGTM was disabled and removed.
2022-12-16 22:34:59 +01:00
Lemongrass3110
4d734abc53 Cleaned up monster skill status checks (#7495)
Fixes 4 more warnings introduced in 1f4c068
2022-12-16 21:56:55 +01:00
Atemo
ef602d98cb Multiple dynamic npc (#7486)
* Vectorize npc_id_dynamic to support multiple dynamic npc with different ids

Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>

Thanks to @dimasshotta and @eppc0330 !
2022-12-16 21:22:31 +01:00
idk-whoami
20dedc7918 Update items first aid starter pack (#7493) 2022-12-16 20:24:47 +01:00
Singe Horizontal
8eac71f57f Cleaned struct tokens for map_session_data and status_change (#7490)
Fixes #7492
2022-12-16 19:16:29 +01:00
Aleos
da375a04c1 Adds battle config mob_respawn_time (#7312)
* Adjusts the minimum respawn time of a monster to be 1 second as it is officially.
* Adds a battle config to allow for easy adjustment.
* Monsters that don't define a delay1 for permanent spawn scripts are defaulted to 5 seconds.
Thanks to @mrjnumber1, @vstumpf, @Lemongrass3110, and @Atemo!
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2022-12-14 14:17:41 -05:00
Vincent Stumpf
1f4c068c39 Refactor status change entries (#7356)
* Make map_session_data a class, call constructor/destructor on alloc/free

* add getSCE

* add create, delete, clear SCE

* Use getSCE, make data access private

* add a cache for last-fetched status
2022-12-13 23:47:53 -08:00
Aleos
ee2dcf816e New macro detection features (#7359)
* Adds battle config macro_detection_punishment to ban or jail characters.
* Adds battle config macro_detection_punishment_time to adjust the duration of ban/jail for players who fail the captcha challenges.
* Adds script command macro_detector which invokes the captcha challenge.
* General cleanups to the jail functions to remove duplicate code.
* General cleanups to the macro punishment calls to remove duplicate code.
* Ending SC_JAILED will now properly remove the jail status rather than trying to reset the timer to 1 second resolving any possibility of players getting stuck.
Thanks to @Lemongrass3110!
2022-12-13 15:44:42 -05:00
Singe Horizontal
5a533a7a12 Fixes drop rate for size-moded mobs (#7482)
* Fixes #7481.
* Restores correct drop rate for spawned size-modified monsters so that they read the current memory instead of the database value if changed.
2022-12-13 08:23:00 -05:00
Aleos
3545a9c82f Minor corrections to SQL readme (#7484)
* Cleans up a bit of the SQL readme so it's less confusing.
Thanks to @emmamarshall451!
2022-12-12 15:09:24 -05:00
Takius
a1798f7094 Fix skill SO_VARETYR_SPEAR (#7425)
* Corrects the hit type resulting in a variance of damage.
2022-12-12 10:53:40 -05:00
Singe Horizontal
1f1b5fe4a0 Restores Dispell removing NPC_AGIUP (#7479)
Fixes #7478
2022-12-11 11:06:07 +07:00
lighta
f7dbe79c34 Fix wedding skill checks (#5579)
* Fixes #5576 and fixes #7475.
* Fix WE_CALLPARTNER, WE_CALLPARENT and WE_CALLBABY fallthrough check.
* Adds usage of packet struct.
* Add autotrade check for WE_CALLPARTNER.
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
Co-authored-by: aleos <aleos89@users.noreply.github.com>
2022-12-10 16:16:52 -05:00
Aleos
aa2bbaa31f Update GitHub workflows (#7477)
* Updates gcc to work on Ubuntu 22.04.
* Force clang to use Ubuntu 20.04 until some build errors are resolved in the environment.
* Adds a concurrency check to disable any active prior runs when pushing a new commit.
2022-12-09 14:53:25 -05:00
eppc0330
7bfae25c74 Fix grade upgrade fail announcement (#7189)
Co-authored-by: Aleos <aleos89@users.noreply.github.com>
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2022-12-05 09:55:58 +01:00
rosald
5549ad2ac2 Update agit_start_se.txt (#7448) 2022-11-30 22:07:43 +01:00
Jittapan Pluemsumran
c9f23e691a Follow up to 4e638838de (#7468) 2022-11-30 15:11:25 +07:00
idk-whoami
795414de4f Removed duplicates list of menu items (#7459)
(from ghost palace exchange npc)
2022-11-29 14:24:24 +01:00
Jittapan Pluemsumran
4e638838de Corrected server response when adding an item to a trade session fails. (#7462)
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2022-11-29 13:24:34 +07:00
Vincent Stumpf
4661016445 Generate Reputation UI bson files (#7340) 2022-11-27 00:53:54 -08:00
Jittapan Pluemsumran
bc4934373d Implemented itemmoveinfov5.txt generator (#7457) 2022-11-26 17:33:27 +07:00
Atemo
9398f698fc Added missing etcs and equips items up to 22 11 2022 (#7453) 2022-11-24 18:35:21 +01:00
Atemo
4353ec3fec Added missing items usable/cash (#7456)
* Added several usable (container) and cash items
* Corrected some aegis item name
* Commented items with rate 0 for subgroup > 0
2022-11-24 13:58:26 +01:00
Aleos
3024d08a39 Fixes a crash from script command searchitem (#7446) 2022-11-19 08:54:47 -05:00
eppc0330
0e1285a94b Remove range & path check for NPC's skill cast (#7422) 2022-11-19 08:06:40 -05:00
Atemo
526a3fa048 Added close3 script command (#7439)
Thanks to @aleos89 @Lemongrass3110 @vstumpf !
2022-11-18 15:39:00 +01:00
Lemongrass3110
eb8587f5b5 Removed the strange ACK function concept (#7404)
Cleans up packet database a little more.
Turned some more packets into structs.

Co-authored-by: Vincent Stumpf <vincents.995@gmail.com>
2022-11-17 22:09:12 +01:00
Atemo
cc5770eda4 Removed deprecated script command "unitemote" (#7443) 2022-11-16 23:00:53 +01:00
Atemo
77aed690ea Small clean-up and correction in item_db / combo DB (#7442) 2022-11-16 23:00:39 +01:00
Livia Medeiros
129ce465b0 Adjust installation and service scripts (#7407)
* Fix install in directory with spaces

* Use $() notation instead of legacy backticks

* Fix help->start enlog message

* Fix typo

* Whitespace cleanup

* Fix restart delay

* Make get_status robust
2022-11-16 13:04:26 -08:00
Atemo
5d8e034868 Added HelpMeShorty dynamic npc and quest (#7415)
* Short quest to allow the player to summon, via an item, a dynamic NPC that gives basic game information.
* After level 30, the player can get a costume in exchange for the item.

Co-authored-by: Aleos <aleos89@users.noreply.github.com>
2022-11-16 14:42:53 +01:00
Aleos
15e27b3567 Updates the db README (#7436)
Updates the db README
Updates a couple examples from TXT to YML.
Wrap examples in code blocks
2022-11-15 23:31:07 +01:00
mazvi
9512eb81ca Added roulette command documentation (#7438)
Added roulette command atcommands.yml

Co-authored-by: Aleos <aleos89@users.noreply.github.com>
2022-11-15 22:47:08 +01:00
Atemo
c415b51b88 isdead script command (#7434)
* return true if a player is dead else false

Thanks to @aleos89 and @Lemongrass3110
2022-11-15 14:45:09 +01:00
Lemongrass3110
a090a0a7ba Added an atcommand for roulette (#7433) 2022-11-14 21:32:10 +01:00
violent01
03f04ed507 Fixed a small typo in Poring Village Instance (#7432) 2022-11-12 19:04:17 +01:00
Jittapan
3f7155bf84 Revert "Bumped db version"
This reverts commit 9db030fcc6.
2022-11-12 12:13:53 +07:00
Jittapan
9db030fcc6 Bumped db version 2022-11-12 12:12:57 +07:00
Balfear
a3703495a0 New Achievements & first aid starter pack (#7414)
Fixes #7406
2022-11-12 00:18:02 +01:00
SapitoSucio
55d3c1578c Itemlink command and integration (#7291)
Co-authored-by: Akkarinage <mike.langford@industrial-illusions.net>
Co-authored-by: Aleos <aleos89@users.noreply.github.com>
Co-authored-by: Atemo <Atemo@users.noreply.github.com>
Co-authored-by: cydh<cydh@users.noreply.github.com>
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
Co-authored-by: secretdataz<secretdataz@users.noreply.github.com>
2022-11-11 18:04:41 +01:00
Lemongrass3110
96efb0e426 Block dynamic NPCs in instances (#7429)
Fixes #7420

Thanks to @attackjom
2022-11-10 22:14:42 +01:00
Balfear
4cb1af31f8 Don't show attendance UI (#7424) 2022-11-10 13:35:27 +01:00
Livia Medeiros
d5bb710eb3 Fix typos (#7421) 2022-11-09 15:59:40 +07:00
Atemo
3515285f43 Correction of getpetinfo parameter in item db (#7401)
Fixed #7398

Thanks to @idk-whoami @kaninhot004 and @Lemongrass3110 !
2022-11-08 22:51:44 +01:00
Lemongrass3110
a763ad0629 Implemented dynamic NPCs (#7402)
This is required for features like #6640
Added COLOR_LIGHT_YELLOW
Cleaned up color definitions, its useless to store them as string first.
Dynamic NPCs will stay when you switch map and come back in time.
Dynamic NPCs will be removed instantly when you log out.
You can only create one dynamic NPC at a time.

Thanks to @Atemo!
2022-11-07 00:41:10 +01:00
Lemongrass3110
774d4ca2e8 Follow up to 99faa58
Thanks to @Singe-Horizontal
2022-11-06 22:51:36 +01:00
idk-whoami
8d536e7ffe Corrected script for some item #12 (#7399)
Thanks to @Atemo
2022-11-06 17:36:21 +01:00
Vietlubu
b351e40070 Fix item script for Paradise Luxury Suit (#7409) 2022-11-06 17:32:13 +01:00
Livia Medeiros
63c3e67d93 Fix typos in Renewal scripts (#7408) 2022-11-06 16:53:23 +01:00
Lemongrass3110
a76e7b8818 Cleanup for guild position change (#7405)
Fixes #7387
This not really fully fixes it, but it makes it more clear.
Additionally changed to structs.

Thanks to @MrAntares
2022-11-05 17:27:02 +01:00
Vincent Stumpf
bf2b62bc9c Fix an issue when running map-server-generator in opt mode (#7378) 2022-11-04 21:00:58 -07:00
Joam
9c0d574787 Adds reputation script command (#7374) 2022-11-03 18:30:58 +01:00
Jittapan
b28eac7b56 Cleaned up CZ_PC_SELL_ITEMLIST and its related functions
* Added a validation check for remaining item amount
2022-11-03 22:08:36 +07:00
HAO YAN
88d6d798c7 Minor fixes to plagiarize script commands (#7394)
* Fix plagiarizeskillreset unable to reset.
* Update plagiarizeskill documentation.
2022-11-02 13:50:18 -04:00
Aleos
66b348c547 Fixes NPC_COMET duration (#7388)
* Fixes #7355.
* Follow up to 2993c0b.
* Resolves an issue with the duration of Burning overlapping with the duration of NPC_COMET.
Thanks to @sonniez and @OptimusM!
2022-11-02 13:01:19 -04:00
idk-whoami
0018c39965 Locations correction of item ID 480023 (#7396) 2022-11-01 12:43:56 +07:00
eppc0330
2896ae21b0 Fix NPC_MAXPAIN skill mechanism (#5820)
* Max Pain will deal reflect damage to all characters on screen.
* Caster of Max Pain will get damaged.
* Max Pain will reflect both weapon and magic damage.
* Max Pain damages as special physical melee attack. PR_KYRIE, MG_SAFETYWALL, etc. can block the damage.
Co-authored-by: Aleos <aleos89@users.noreply.github.com>
Co-authored-by: Daegaladh <Daegaladh@users.noreply.github.com>
2022-10-31 13:54:53 -04:00
idk-whoami
73112801c6 Corrected script for some item (#7392)
* Added missing ; on active_transform and various fixes

Fixed #7382

Thanks to @kaninhot004 !
2022-10-29 23:33:45 +02:00
userid0
086a757235 Add navigenerator.bat to gitignore (#7386) 2022-10-26 08:20:48 -04:00
eppc0330
d0e39fbea7 Remove ASC_EDP nosave flag (#7384) 2022-10-25 15:55:09 +07:00
userid0
4836e09199 Fix compiler warning C4244. (#7295) 2022-10-24 10:02:27 -04:00
Pokye
de00e03bd9 Added Missing Shops Script (#7362)
* Added Character Position Change Coupon seller
* Added Emperium Seller

Thanks @aleos89 @Atemo @Balferian @Everade @secretdataz !
2022-10-23 13:54:16 +02:00
HAO YAN
9bf012d297 Update plagiarism script command name (#7377) 2022-10-22 15:11:17 -04:00
Atemo
59432412be Added missing SubType for item ID 1998 (#7373)
Fixed #7371

Thanks to @kaninhot004 !
2022-10-22 12:58:22 +02:00
Atemo
53d5fc609a Updated damagetaken (#7372)
Save damagetaken in mob_data for mob controller
2022-10-22 12:57:46 +02:00
Aleos
4a5b8e33dc Follow up to c3a171d (#7375)
* Fixes a compile warning.
2022-10-21 10:44:17 -04:00
HAO YAN
a001e1c6e3 Add Player Fame script commands (#7310)
* Add the ability to update and retrieve fame info of a character.
2022-10-20 13:05:39 -04:00
HAO YAN
07c18f248b Add getrandmobid script command (#7309)
* Used to generate random monster ID in NPC scripts.
2022-10-20 12:25:49 -04:00
HAO YAN
c3a171da81 Add skill_plagiarism script commands (#6304)
* Allow players to copy skills with script command skill_plagiarism.
* Plagiarized skills can be cleared with script command skill_plagiarism_reset.
2022-10-20 11:16:46 -04:00
HAO YAN
7d19b4bbdd Add cap_value script command (#7307)
* Supports int64.
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2022-10-20 10:33:20 -04:00
Aleos
8073d4e084 Adds EndOnEnd node to status database (#7313)
* Any status defined under EndOnEnd will be removed when the status becomes inactive.
* Renames End to EndOnStart.
* Removes some hard coded statuses.
* Includes YamlUpgrade Tool update to rename End -> EndOnStart.
Thanks to @Lemongrass3110!
2022-10-20 10:04:00 -04:00
Atemo
bc2afbdfc2 SubType correction of item ID 28141 (#7368)
Fixed #7366

Thanks to @kaninhot004
2022-10-19 02:08:41 +02:00
Balfear
067ecbdeb4 Okolnir quest (missed warp coordinates) (#7286)
Added official warp coordinates in the quest
2022-10-17 11:34:01 +02:00
Atemo
43036926cf Added new items up to october 2022 (#7357)
* Removed duplicate combos and sorted the item ID in item_db_etc.yml
* Updated etc items
* Added equip items
2022-10-16 12:53:16 +02:00
Pokye
e95eb0ad84 Minor fix script Carbonated Water Vending Machine (#7361)
* Minor fix script Carbonated Water Vending Machine
* Added Atemo suggestion.

Fixed #7360
2022-10-15 12:05:05 +02:00
Aleos
d7bf5ebb58 Adds support for macro detection (#7315)
* Adds the official client macro detection system.
* Includes the ability to load imagery at server boot.
* See doc/captcha_db.txt for more information!
Thanks to @Asheraf and @Lemongrass3110!
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2022-10-14 10:54:19 -04:00
Atemo
750c7d72de Permanent mob spawn definition update (#7352)
* Added support for mob name (sprite) as parameter in mob permanent spawn definition

Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2022-10-13 23:44:26 +02:00
Aleos
8138281d90 Fixes a possible size mismatch for isspace() (#7311)
* Fixes #5928.
* Passing a char type argument to isspace() could result in unpredictable results.
Thanks to @hyunji-Hong and @Lemongrass3110!
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2022-10-13 11:05:43 -04:00
Atemo
bbc516a4d5 Deprecated itemdb_exists (#7353)
Deprecated itemdb_exists to use item_db.exists() or item_db.find() instead

Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2022-10-13 16:39:40 +02:00
Aleos
a9a47dcde4 Updates the cooldowns for new guild skills (#7306)
* Fixes #6184.
* Adjusts the cooldown of Charge Shout Flag to 15 minutes.
* Adjusts the cooldown of Charge Shout Beating to 15 minutes.
* Adjusts the cooldown of Emergency Move to 1 minute.
Thanks to @Everade and Dia!
2022-10-13 09:49:23 -04:00
Vincent Stumpf
64959d30cd Add custom depenencies for atcommand, script, and battle (#7274) 2022-10-13 15:06:00 +02:00
Aleos
fba0f4ee70 Fixes SA_DRAGONOLOGY MATK behavior (#7328)
* The MATK bonus should only be doubled versus Dragons, not quadrupled like the other bonuses.
* Confirmed the behaviors between pre-renewal and renewal.
Thanks to @mrjnumber1!
2022-10-13 08:26:42 -04:00
Atemo
e56694f161 Updated mapcache (#7354) 2022-10-13 12:22:30 +02:00
HAO YAN
f6633b5e7d Update Autopot NPC (#7308)
Fix delay shouldn't go below the `.MinDelay` or above `.MaxDelay`.
2022-10-12 23:27:24 +02:00
Aleos
7f82194eca Adds SC_WEAPONBREAKER status (#7265)
* Fixes #6915.
* Adds the SC_WEAPONBREAKER status which is applied via NPC_WEAPONBRAKER's self cast ability.
* Adds a chance to break a target's weapon at 2 * skill_lv% for 30 seconds.
Thanks to @Playtester!
2022-10-12 16:53:49 -04:00
Lemongrass3110
5b396bf7f1 Fixed some more hardcoded directions (#7317)
Replaced hardcoded numbers with their respective constants to increase maintainability and readability.
2022-10-12 22:38:22 +02:00
Lemongrass3110
e4e4ba1af0 Removed a debug message in web-server (#7305)
Fixes #7194
If a character/account logs in the first time, we silently store the default configuration in the foreseen tables now.
Fixes the problem that the client does not call account configuration save in newer versions and therefore always triggers the debug message.

Thanks to @idk-whoami
2022-10-12 21:44:03 +02:00
Vincent Stumpf
e28fb93f1e Fix warning when sending party message (#7350)
Fixes #7344
Thanks @24msz6eo
2022-10-12 21:04:51 +07:00
Lemongrass3110
311cda80af Fixed an invalid primary key in web.sql (#7304)
Fixes #7290

Thanks to @Tolimatoi
2022-10-11 23:41:08 +07:00
Aleos
3d3a5159e3 Updates NPC_SIEGEMODE comment to known behavior (#7327) 2022-10-11 08:03:30 -04:00
Vincent Stumpf
7b2a682c47 Fix pet_endautobonus crash (#7342)
Fixes #7292
2022-10-11 15:04:15 +07:00
idk-whoami
323a44ad86 Corrected rockridge shop name (#7341) 2022-10-11 00:04:24 +02:00
Atemo
7649947d50 Initial release of Juno monster society (#7323)
Thanks to @Daegaladh !
2022-10-11 00:03:13 +02:00
Jittapan Pluemsumran
43f5094620 Fixed "Unequip All" button not working on main server clients. Fixes #7337 (#7338) 2022-10-10 11:06:23 +07:00
Jittapan Pluemsumran
fa36ae27dd Fixed zero-length packet warning on party member logoff. Fixes #7324 (#7339)
Co-authored-by: Aleos <aleos89@users.noreply.github.com>
2022-10-09 18:21:57 +07:00
Vincent Stumpf
6bb29c0743 add nlohmann json to better support web service (#7325) 2022-10-08 20:18:04 -07:00
Aleos
7d09041018 Updates the script command doc min/max int value (#7329) 2022-10-08 08:03:50 -04:00
Vincent Stumpf
0de6ff37f7 Add map-server-generator to gitignore (#7331) 2022-10-07 21:16:59 -07:00
Aleos
4ae56ba94c Fixes Marine Sphere behavior (#7333)
* Fixes #7332.
* Resolves an issue where Marine Sphere were not casting their skills after being hit.
Thanks to @violent01 and @Daegaladh!
2022-10-07 15:54:07 -04:00
Jittapan Pluemsumran
9d0fa3523e Allow Blacksmith Blessing usage on level 5 weapons and level 2 armors (#7326) 2022-10-07 22:28:27 +07:00
Kasper Sandin
b568f2fb11 Remove unclosed npc script code blocks (#7330) 2022-10-07 13:47:57 +07:00
mazvi
1b0c50ad01 Update bug_report.yml (#7294)
* Include command line steps to retrieve git hash.
Thanks to @Lemongrass3110
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2022-10-05 13:19:21 -04:00
Lemongrass3110
99faa588ad Fixed names of two timer functions (#7319)
Blame it on me in 01f61cfa
2022-10-05 16:31:03 +02:00
Atemo
79bb537fa2 Initial release of the Poring village instance (#7293)
* Initial release of the Poring village instance

Co-authored-by: Aleos <aleos89@users.noreply.github.com>
2022-10-04 21:19:48 +02:00
JohnnyPlayy
85a938ecce Implementing the Script Gemstone Bagger! (#7318)
* Adding The Gem Bagging!

* Adding suggestion from @aleos89 
* Adding suggestion from @Atemo
2022-10-04 21:18:06 +02:00
idk-whoami
48f1493747 Corrected script for some item #11 (#7277)
Thanks to @Atemo
Thanks to @Balferian
2022-10-04 19:47:57 +02:00
Atemo
edc7137176 Fixed several item scripts (#7316) 2022-10-04 16:05:28 +02:00
Jittapan Pluemsumran
19fe27932f Implemented refine result broadcast packet (#7301) 2022-10-04 15:27:25 +07:00
Jittapan Pluemsumran
6fc3a07247 Follow up to 588f321d08
[ci skip]
2022-10-03 14:36:48 +07:00
Jittapan Pluemsumran
588f321d08 Follow up to 39b3e5fe29 2022-10-03 12:46:07 +07:00
Jittapan Pluemsumran
39b3e5fe29 Jewelers across the server now sells more jewel items (#7320)
Follow-up for enchantgrade feature.
2022-10-03 12:36:32 +07:00
Sader Fawall
9c2576f47a duplicate npc command script (#5960)
Co-authored-by: Aleos <aleos89@users.noreply.github.com>
Co-authored-by: Atemo <Atemo@users.noreply.github.com>
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
2022-10-01 22:58:53 +02:00
Everade
c7ec076a6c Database entries for Episode 16.1 and 16.2 Memorial Dungeons (#7297)
Half Moon In The Daylight, Weekend Dungeon, Friday Dungeon
2022-10-01 04:03:46 +02:00
610 changed files with 309439 additions and 52854 deletions

View File

@@ -6,7 +6,9 @@ body:
id: hash
attributes:
label: rAthena Hash
description: Please specify the rAthena [GitHub hash](https://help.github.com/articles/autolinked-references-and-urls/#commit-shas) on which you encountered this issue.
description: |
Please specify the rAthena [GitHub hash](https://help.github.com/articles/autolinked-references-and-urls/#commit-shas) on which you encountered this issue.
One way to get your hash is to type `git rev-parse --short HEAD` on your console.
validations:
required: true
- type: input

92
.github/workflows/analysis_codeql.yml vendored Normal file
View File

@@ -0,0 +1,92 @@
name: Analyse servers with CodeQL
# analysis_codeql.yml
concurrency:
group: ${{ github.repository }}-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ github.ref != 'refs/heads/master' }}
on:
workflow_dispatch:
push:
branches:
- master
pull_request:
paths:
# Always trigger all Github Actions if an action or something CI related was changed
- '.github/workflows/**'
- 'tools/ci/**'
# This workflow should run when a file in a source directory has been modified.
- 'src/**'
- '3rdparty/**'
jobs:
analyze:
# Github Actions checks for '[ci skip]', '[skip ci]', '[no ci]', '[skip actions]', or '[actions skip]' but not a hyphenated version.
# It's a catch-all incase a Pull Request has been opened and someone is on auto-pilot.
if: "!contains(github.event.head_commit.message, 'ci-skip')"
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
# The ubuntu-latest label currently points to ubuntu-20.04.
# Available: ubuntu-22.04, ubuntu-20.04
os: [ubuntu-latest]
# Older versions of GCC are not available via unaltered aptitude repo lists.
gcc: ['10']
# We run build checks for both Renewal and PRE-Renewal
mode: ['PRE','RE']
steps:
- name: Checkout repository
uses: actions/checkout@v3
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v2
with:
# CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ]
# Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support
languages: cpp
# Trigger security and quality findings
# https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs
# TODO: Resolve the issues and then enable it again
#queries: +security-and-quality
# A simple 'yes' and 'no' can be confusing, so we use names to display in the current job then convert them for use in the compiler.
- name: Variable Parsing - PRE
if: ${{ matrix.mode == 'PRE' }}
run: |
echo "PRERE=yes" >> $GITHUB_ENV
- name: Variable Parsing - RE
if: ${{ matrix.mode == 'RE' }}
run: |
echo "PRERE=no" >> $GITHUB_ENV
- name: Update & Install packages
# Ubuntu runners already have most of the packages rAthena requires to build.
# https://github.com/actions/virtual-environments/blob/main/images/linux/Ubuntu2004-Readme.md
run: |
sudo apt update
sudo apt install zlib1g-dev libpcre3-dev gcc-${{ matrix.gcc }} g++-${{ matrix.gcc }}
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
# If this step fails, then you should remove it and run the build manually (see below)
#- name: Autobuild
# uses: github/codeql-action/autobuild@v2
# ✏️ If the Autobuild fails above, remove it and uncomment the following
# three lines and modify them (or add more) to build your code if your
# project uses a compiled language
- name: Command - configure
env:
CONFIGURE_FLAGS: 'CC=gcc-${{ matrix.gcc }} CXX=g++-${{ matrix.gcc }} --enable-prere=${{ env.PRERE }} --enable-buildbot=yes'
run: ./configure $CONFIGURE_FLAGS
- name: Command - make clean
run: make clean
- name: Command - make server
run: make server
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v2

View File

@@ -1,7 +1,12 @@
name: Build servers with Clang
# build_servers_clang.yml
concurrency:
group: ${{ github.repository }}-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ github.ref != 'refs/heads/master' }}
on:
workflow_dispatch:
push:
branches:
- master
@@ -22,9 +27,9 @@ jobs:
runs-on: ${{ matrix.os }}
strategy:
matrix:
# The ubuntu-latest label currently points to ubuntu-20.04.
# The ubuntu-latest label currently points to ubuntu-22.04.
# Available: ubuntu-22.04, ubuntu-20.04
os: [ubuntu-latest]
os: [ubuntu-20.04]
# Version list can be found on https://github.com/marketplace/actions/install-clang
clang: ['6.0', '7', '8', '9', '10', '11'] #, '12', '13']

View File

@@ -1,7 +1,12 @@
name: Build servers with CMake
# build_servers_cmake.yml
concurrency:
group: ${{ github.repository }}-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ github.ref != 'refs/heads/master' }}
on:
workflow_dispatch:
push:
branches:
- master
@@ -13,6 +18,8 @@ on:
# This workflow should run when a file in a source directory has been modified.
- 'src/**'
- '3rdparty/**'
# This workflow should run whenever a CMake related file has been modified
- '**/CMakeLists.txt'
jobs:
build:
@@ -22,7 +29,7 @@ jobs:
runs-on: ${{ matrix.os }}
strategy:
matrix:
# The ubuntu-latest label currently points to ubuntu-20.04.
# The ubuntu-latest label currently points to ubuntu-22.04.
# Available: ubuntu-22.04, ubuntu-20.04
os: [ubuntu-latest]

View File

@@ -1,7 +1,12 @@
name: Build servers with GCC
# build_servers_gcc.yml
concurrency:
group: ${{ github.repository }}-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ github.ref != 'refs/heads/master' }}
on:
workflow_dispatch:
push:
branches:
- master
@@ -22,11 +27,11 @@ jobs:
runs-on: ${{ matrix.os }}
strategy:
matrix:
# The ubuntu-latest label currently points to ubuntu-20.04.
# The ubuntu-latest label currently points to ubuntu-22.04.
# Available: ubuntu-22.04, ubuntu-20.04
os: [ubuntu-latest]
# Older versions of GCC are not available via unaltered aptitude repo lists.
gcc: ['7', '8', '9', '10']
gcc: ['9', '10', '11']
steps:
- uses: actions/checkout@v2

View File

@@ -1,7 +1,12 @@
name: Build servers in Pre-Renewal and Renewal
# build_servers_modes.yml
concurrency:
group: ${{ github.repository }}-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ github.ref != 'refs/heads/master' }}
on:
workflow_dispatch:
push:
branches:
- master
@@ -22,11 +27,11 @@ jobs:
runs-on: ${{ matrix.os }}
strategy:
matrix:
# The ubuntu-latest label currently points to ubuntu-20.04.
# The ubuntu-latest label currently points to ubuntu-22.04.
# Available: ubuntu-22.04, ubuntu-20.04
os: [ubuntu-latest]
# Older versions of GCC are not available via unaltered aptitude repo lists.
gcc: ['10']
gcc: ['11']
# We run build checks for both Renewal and PRE-Renewal
mode: ['PRE','RE']

View File

@@ -1,7 +1,12 @@
name: Build servers with MSVS
# build_servers_msbuild.yml
concurrency:
group: ${{ github.repository }}-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ github.ref != 'refs/heads/master' }}
on:
workflow_dispatch:
push:
branches:
- master

View File

@@ -1,7 +1,12 @@
name: Build servers with different packet versions
# build_servers_packetversions.yml
concurrency:
group: ${{ github.repository }}-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ github.ref != 'refs/heads/master' }}
on:
workflow_dispatch:
push:
branches:
- master
@@ -22,11 +27,11 @@ jobs:
runs-on: ${{ matrix.os }}
strategy:
matrix:
# The ubuntu-latest label currently points to ubuntu-20.04.
# The ubuntu-latest label currently points to ubuntu-22.04.
# Available: ubuntu-22.04, ubuntu-20.04
os: [ubuntu-latest]
# Older versions of GCC are not available via unaltered aptitude repo lists.
gcc: ['10']
gcc: ['11']
# We run build checks for both Renewal and PRE-Renewal
mode: ['PRE','RE']
# Check build success for different packet-versions

View File

@@ -1,7 +1,12 @@
name: Build servers in VIP mode
# build_servers_vip.yml
concurrency:
group: ${{ github.repository }}-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ github.ref != 'refs/heads/master' }}
on:
workflow_dispatch:
push:
branches:
- master
@@ -22,11 +27,11 @@ jobs:
runs-on: ${{ matrix.os }}
strategy:
matrix:
# The ubuntu-latest label currently points to ubuntu-20.04.
# The ubuntu-latest label currently points to ubuntu-22.04.
# Available: ubuntu-22.04, ubuntu-20.04
os: [ubuntu-latest]
# Older versions of GCC are not available via unaltered aptitude repo lists.
gcc: ['10']
gcc: ['11']
# We run build checks for both Renewal and PRE-Renewal
mode: ['PRE', 'RE']

View File

@@ -4,7 +4,12 @@ name: Validate NPC Scripts and DB Changes
# For NPC and DB validation we only need two builds: one of Renewal and one for Pre-Renewal checks.
# NPC scripts and database files are not platform dependent, so we can achieve this validation using only a simple linux setup.
concurrency:
group: ${{ github.repository }}-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ github.ref != 'refs/heads/master' }}
on:
workflow_dispatch:
push:
branches:
- master
@@ -25,11 +30,11 @@ jobs:
runs-on: ${{ matrix.os }}
strategy:
matrix:
# The ubuntu-latest label currently points to ubuntu-20.04.
# The ubuntu-latest label currently points to ubuntu-22.04.
# Available: ubuntu-22.04, ubuntu-20.04
os: [ubuntu-latest]
# Only a single version of GCC is required for validating NPC scripts and database changes.
gcc: ['10']
gcc: ['11']
# We run build checks for both Renewal and PRE-Renewal
mode: ['PRE', 'RE']

2
.gitignore vendored
View File

@@ -39,6 +39,7 @@ Thumbs.db
/Makefile
/Makefile.cache
/map-server
/map-server-generator
/mapcache
/nbproject
/web-server
@@ -136,6 +137,7 @@ Thumbs.db
/webserv.bat
/yaml2sql.bat
/yamlupgrade.bat
/navigenerator.bat
# dlls
/libmysql.dll

View File

@@ -48,6 +48,7 @@ endmacro( CONFIGURE_WITH_LOCAL_OR_SYSTEM )
add_subdirectory( httplib )
add_subdirectory( json )
add_subdirectory( libconfig )
add_subdirectory( mysql )
add_subdirectory( pcre )

2
3rdparty/README.txt vendored
View File

@@ -6,3 +6,5 @@ libconfig - library for processing structured configuration files (http://www.hy
mysql - library for MySQL Community Server (http://www.mysql.com)
pcre - library for Perl Compatible Regular Expressions (http://www.pcre.org)
zlib - library for DEFLATE lossless compression algorithm (http://www.zlib.net)
json - library for nlohmann json (https://github.com/nlohmann/json/tree/4b2c8ce6bcfe7f39f2bb9e680c1e7a4d67c2dd48)
yaml-cpp - library for yaml (https://github.com/jbeder/yaml-cpp/tree/0e6e28d1a38224fc8172fae0109ea7f673c096db)

7
3rdparty/json/CMakeLists.txt vendored Normal file
View File

@@ -0,0 +1,7 @@
cmake_minimum_required(VERSION 2.8)
set (JSON_INCLUDE_DIRS
"${CMAKE_CURRENT_SOURCE_DIR}/include"
CACHE INTERNAL "json include dir" )
mark_as_advanced( JSON_INCLUDE_DIRS )

21
3rdparty/json/LICENSE.MIT vendored Normal file
View File

@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2013-2022 Niels Lohmann
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

24641
3rdparty/json/include/nlohmann/json.hpp vendored Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,177 @@
// __ _____ _____ _____
// __| | __| | | | JSON for Modern C++
// | | |__ | | | | | | version 3.11.2
// |_____|_____|_____|_|___| https://github.com/nlohmann/json
//
// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann <https://nlohmann.me>
// SPDX-License-Identifier: MIT
#ifndef INCLUDE_NLOHMANN_JSON_FWD_HPP_
#define INCLUDE_NLOHMANN_JSON_FWD_HPP_
#include <cstdint> // int64_t, uint64_t
#include <map> // map
#include <memory> // allocator
#include <string> // string
#include <vector> // vector
// #include <nlohmann/detail/abi_macros.hpp>
// __ _____ _____ _____
// __| | __| | | | JSON for Modern C++
// | | |__ | | | | | | version 3.11.2
// |_____|_____|_____|_|___| https://github.com/nlohmann/json
//
// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann <https://nlohmann.me>
// SPDX-License-Identifier: MIT
// This file contains all macro definitions affecting or depending on the ABI
#ifndef JSON_SKIP_LIBRARY_VERSION_CHECK
#if defined(NLOHMANN_JSON_VERSION_MAJOR) && defined(NLOHMANN_JSON_VERSION_MINOR) && defined(NLOHMANN_JSON_VERSION_PATCH)
#if NLOHMANN_JSON_VERSION_MAJOR != 3 || NLOHMANN_JSON_VERSION_MINOR != 11 || NLOHMANN_JSON_VERSION_PATCH != 2
#warning "Already included a different version of the library!"
#endif
#endif
#endif
#define NLOHMANN_JSON_VERSION_MAJOR 3 // NOLINT(modernize-macro-to-enum)
#define NLOHMANN_JSON_VERSION_MINOR 11 // NOLINT(modernize-macro-to-enum)
#define NLOHMANN_JSON_VERSION_PATCH 2 // NOLINT(modernize-macro-to-enum)
#ifndef JSON_DIAGNOSTICS
#define JSON_DIAGNOSTICS 0
#endif
#ifndef JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON
#define JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON 0
#endif
#if JSON_DIAGNOSTICS
#define NLOHMANN_JSON_ABI_TAG_DIAGNOSTICS _diag
#else
#define NLOHMANN_JSON_ABI_TAG_DIAGNOSTICS
#endif
#if JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON
#define NLOHMANN_JSON_ABI_TAG_LEGACY_DISCARDED_VALUE_COMPARISON _ldvcmp
#else
#define NLOHMANN_JSON_ABI_TAG_LEGACY_DISCARDED_VALUE_COMPARISON
#endif
#ifndef NLOHMANN_JSON_NAMESPACE_NO_VERSION
#define NLOHMANN_JSON_NAMESPACE_NO_VERSION 0
#endif
// Construct the namespace ABI tags component
#define NLOHMANN_JSON_ABI_TAGS_CONCAT_EX(a, b) json_abi ## a ## b
#define NLOHMANN_JSON_ABI_TAGS_CONCAT(a, b) \
NLOHMANN_JSON_ABI_TAGS_CONCAT_EX(a, b)
#define NLOHMANN_JSON_ABI_TAGS \
NLOHMANN_JSON_ABI_TAGS_CONCAT( \
NLOHMANN_JSON_ABI_TAG_DIAGNOSTICS, \
NLOHMANN_JSON_ABI_TAG_LEGACY_DISCARDED_VALUE_COMPARISON)
// Construct the namespace version component
#define NLOHMANN_JSON_NAMESPACE_VERSION_CONCAT_EX(major, minor, patch) \
_v ## major ## _ ## minor ## _ ## patch
#define NLOHMANN_JSON_NAMESPACE_VERSION_CONCAT(major, minor, patch) \
NLOHMANN_JSON_NAMESPACE_VERSION_CONCAT_EX(major, minor, patch)
#if NLOHMANN_JSON_NAMESPACE_NO_VERSION
#define NLOHMANN_JSON_NAMESPACE_VERSION
#else
#define NLOHMANN_JSON_NAMESPACE_VERSION \
NLOHMANN_JSON_NAMESPACE_VERSION_CONCAT(NLOHMANN_JSON_VERSION_MAJOR, \
NLOHMANN_JSON_VERSION_MINOR, \
NLOHMANN_JSON_VERSION_PATCH)
#endif
// Combine namespace components
#define NLOHMANN_JSON_NAMESPACE_CONCAT_EX(a, b) a ## b
#define NLOHMANN_JSON_NAMESPACE_CONCAT(a, b) \
NLOHMANN_JSON_NAMESPACE_CONCAT_EX(a, b)
#ifndef NLOHMANN_JSON_NAMESPACE
#define NLOHMANN_JSON_NAMESPACE \
nlohmann::NLOHMANN_JSON_NAMESPACE_CONCAT( \
NLOHMANN_JSON_ABI_TAGS, \
NLOHMANN_JSON_NAMESPACE_VERSION)
#endif
#ifndef NLOHMANN_JSON_NAMESPACE_BEGIN
#define NLOHMANN_JSON_NAMESPACE_BEGIN \
namespace nlohmann \
{ \
inline namespace NLOHMANN_JSON_NAMESPACE_CONCAT( \
NLOHMANN_JSON_ABI_TAGS, \
NLOHMANN_JSON_NAMESPACE_VERSION) \
{
#endif
#ifndef NLOHMANN_JSON_NAMESPACE_END
#define NLOHMANN_JSON_NAMESPACE_END \
} /* namespace (inline namespace) NOLINT(readability/namespace) */ \
} // namespace nlohmann
#endif
/*!
@brief namespace for Niels Lohmann
@see https://github.com/nlohmann
@since version 1.0.0
*/
NLOHMANN_JSON_NAMESPACE_BEGIN
/*!
@brief default JSONSerializer template argument
This serializer ignores the template arguments and uses ADL
([argument-dependent lookup](https://en.cppreference.com/w/cpp/language/adl))
for serialization.
*/
template<typename T = void, typename SFINAE = void>
struct adl_serializer;
/// a class to store JSON values
/// @sa https://json.nlohmann.me/api/basic_json/
template<template<typename U, typename V, typename... Args> class ObjectType =
std::map,
template<typename U, typename... Args> class ArrayType = std::vector,
class StringType = std::string, class BooleanType = bool,
class NumberIntegerType = std::int64_t,
class NumberUnsignedType = std::uint64_t,
class NumberFloatType = double,
template<typename U> class AllocatorType = std::allocator,
template<typename T, typename SFINAE = void> class JSONSerializer =
adl_serializer,
class BinaryType = std::vector<std::uint8_t>, // cppcheck-suppress syntaxError
class CustomBaseClass = void>
class basic_json;
/// @brief JSON Pointer defines a string syntax for identifying a specific value within a JSON document
/// @sa https://json.nlohmann.me/api/json_pointer/
template<typename RefStringType>
class json_pointer;
/*!
@brief default specialization
@sa https://json.nlohmann.me/api/json/
*/
using json = basic_json<>;
/// @brief a minimal map-like container that preserves insertion order
/// @sa https://json.nlohmann.me/api/ordered_map/
template<class Key, class T, class IgnoredLess, class Allocator>
struct ordered_map;
/// @brief specialization that maintains the insertion order of object keys
/// @sa https://json.nlohmann.me/api/ordered_json/
using ordered_json = basic_json<nlohmann::ordered_map>;
NLOHMANN_JSON_NAMESPACE_END
#endif // INCLUDE_NLOHMANN_JSON_FWD_HPP_

View File

@@ -21,6 +21,7 @@ set( YAML_HEADERS
"${YAML_INCLUDE_DIRS}/yaml-cpp/ostream_wrapper.h"
"${YAML_INCLUDE_DIRS}/yaml-cpp/null.h"
"${YAML_INCLUDE_DIRS}/yaml-cpp/noncopyable.h"
"${YAML_INCLUDE_DIRS}/yaml-cpp/noexcept.h"
"${YAML_INCLUDE_DIRS}/yaml-cpp/mark.h"
"${YAML_INCLUDE_DIRS}/yaml-cpp/exceptions.h"
"${YAML_INCLUDE_DIRS}/yaml-cpp/eventhandler.h"
@@ -30,6 +31,7 @@ set( YAML_HEADERS
"${YAML_INCLUDE_DIRS}/yaml-cpp/emitterdef.h"
"${YAML_INCLUDE_DIRS}/yaml-cpp/emitfromevents.h"
"${YAML_INCLUDE_DIRS}/yaml-cpp/dll.h"
"${YAML_INCLUDE_DIRS}/yaml-cpp/depthguard.h"
"${YAML_INCLUDE_DIRS}/yaml-cpp/binary.h"
"${YAML_INCLUDE_DIRS}/yaml-cpp/anchor.h"
"${YAML_INCLUDE_DIRS}/yaml-cpp/node/type.h"
@@ -46,6 +48,7 @@ set( YAML_HEADERS
set( YAML_SOURCES
"${YAML_SOURCE_DIR}/binary.cpp"
"${YAML_SOURCE_DIR}/convert.cpp"
"${YAML_SOURCE_DIR}/depthguard.cpp"
"${YAML_SOURCE_DIR}/directives.cpp"
"${YAML_SOURCE_DIR}/emit.cpp"
"${YAML_SOURCE_DIR}/emitfromevents.cpp"
@@ -81,3 +84,4 @@ set( YAML_DEFINITIONS
include_directories(${YAML_INCLUDE_DIRS} ${YAML_SOURCE_DIR})
#message(STATUS "YAML_INCLUDE_DIRS : ${YAML_INCLUDE_DIRS}, YAML_SOURCE_DIR=${YAML_SOURCE_DIR}")
ADD_LIBRARY(${this_target} STATIC ${YAML_SOURCES} )
target_compile_definitions(${this_target} PUBLIC "-DYAML_CPP_STATIC_DEFINE")

View File

@@ -4,7 +4,7 @@ YAML_CPP_DIR_OBJ = $(YAML_CPP_OBJ:%=obj/%)
YAML_CPP_H = $(shell find * -type f -name "*.h")
YAML_CPP_AR = obj/yaml-cpp.a
CXXFLAG =-std=c++11
CXXFLAG =-std=c++17 -DYAML_CPP_STATIC_DEFINE
INC=-Iinclude
@SET_MAKE@

View File

@@ -10,7 +10,7 @@
#include <cstddef>
namespace YAML {
typedef std::size_t anchor_t;
using anchor_t = std::size_t;
const anchor_t NullAnchor = 0;
}

View File

@@ -19,9 +19,13 @@ YAML_CPP_API std::vector<unsigned char> DecodeBase64(const std::string &input);
class YAML_CPP_API Binary {
public:
Binary() : m_unownedData(0), m_unownedSize(0) {}
Binary(const unsigned char *data_, std::size_t size_)
: m_unownedData(data_), m_unownedSize(size_) {}
: m_data{}, m_unownedData(data_), m_unownedSize(size_) {}
Binary() : Binary(nullptr, 0) {}
Binary(const Binary &) = default;
Binary(Binary &&) = default;
Binary &operator=(const Binary &) = default;
Binary &operator=(Binary &&) = default;
bool owned() const { return !m_unownedData; }
std::size_t size() const { return owned() ? m_data.size() : m_unownedSize; }
@@ -35,7 +39,7 @@ class YAML_CPP_API Binary {
rhs.clear();
rhs.resize(m_unownedSize);
std::copy(m_unownedData, m_unownedData + m_unownedSize, rhs.begin());
m_unownedData = 0;
m_unownedData = nullptr;
m_unownedSize = 0;
} else {
m_data.swap(rhs);
@@ -62,6 +66,6 @@ class YAML_CPP_API Binary {
const unsigned char *m_unownedData;
std::size_t m_unownedSize;
};
}
} // namespace YAML
#endif // BASE64_H_62B23520_7C8E_11DE_8A39_0800200C9A66

View File

@@ -22,6 +22,7 @@ namespace YAML {
template <class T>
class AnchorDict {
public:
AnchorDict() : m_data{} {}
void Register(anchor_t anchor, T value) {
if (anchor > m_data.size()) {
m_data.resize(anchor);
@@ -34,6 +35,6 @@ class AnchorDict {
private:
std::vector<T> m_data;
};
}
} // namespace YAML
#endif // ANCHORDICT_H_62B23520_7C8E_11DE_8A39_0800200C9A66

View File

@@ -15,10 +15,12 @@ class Parser;
// GraphBuilderInterface
// . Abstraction of node creation
// . pParentNode is always NULL or the return value of one of the NewXXX()
// . pParentNode is always nullptr or the return value of one of the NewXXX()
// functions.
class GraphBuilderInterface {
public:
virtual ~GraphBuilderInterface() = 0;
// Create and return a new node with a null value.
virtual void *NewNull(const Mark &mark, void *pParentNode) = 0;
@@ -71,9 +73,9 @@ class GraphBuilder : public GraphBuilderInterface {
typedef typename Impl::Map Map;
GraphBuilder(Impl &impl) : m_impl(impl) {
Map *pMap = NULL;
Sequence *pSeq = NULL;
Node *pNode = NULL;
Map *pMap = nullptr;
Sequence *pSeq = nullptr;
Node *pNode = nullptr;
// Type consistency checks
pNode = pMap;

View File

@@ -0,0 +1,77 @@
#ifndef DEPTH_GUARD_H_00000000000000000000000000000000000000000000000000000000
#define DEPTH_GUARD_H_00000000000000000000000000000000000000000000000000000000
#if defined(_MSC_VER) || \
(defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || \
(__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4
#pragma once
#endif
#include "exceptions.h"
namespace YAML {
/**
* @brief The DeepRecursion class
* An exception class which is thrown by DepthGuard. Ideally it should be
* a member of DepthGuard. However, DepthGuard is a templated class which means
* that any catch points would then need to know the template parameters. It is
* simpler for clients to not have to know at the catch point what was the
* maximum depth.
*/
class DeepRecursion : public ParserException {
public:
virtual ~DeepRecursion() = default;
DeepRecursion(int depth, const Mark& mark_, const std::string& msg_);
// Returns the recursion depth when the exception was thrown
int depth() const {
return m_depth;
}
private:
int m_depth = 0;
};
/**
* @brief The DepthGuard class
* DepthGuard takes a reference to an integer. It increments the integer upon
* construction of DepthGuard and decrements the integer upon destruction.
*
* If the integer would be incremented past max_depth, then an exception is
* thrown. This is ideally geared toward guarding against deep recursion.
*
* @param max_depth
* compile-time configurable maximum depth.
*/
template <int max_depth = 2000>
class DepthGuard final {
public:
DepthGuard(int & depth_, const Mark& mark_, const std::string& msg_) : m_depth(depth_) {
++m_depth;
if ( max_depth <= m_depth ) {
throw DeepRecursion{m_depth, mark_, msg_};
}
}
DepthGuard(const DepthGuard & copy_ctor) = delete;
DepthGuard(DepthGuard && move_ctor) = delete;
DepthGuard & operator=(const DepthGuard & copy_assign) = delete;
DepthGuard & operator=(DepthGuard && move_assign) = delete;
~DepthGuard() {
--m_depth;
}
int current_depth() const {
return m_depth;
}
private:
int & m_depth;
};
} // namespace YAML
#endif // DEPTH_GUARD_H_00000000000000000000000000000000000000000000000000000000

View File

@@ -1,33 +1,61 @@
#ifndef DLL_H_62B23520_7C8E_11DE_8A39_0800200C9A66
#define DLL_H_62B23520_7C8E_11DE_8A39_0800200C9A66
#if defined(_MSC_VER) || \
(defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || \
(__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4
#pragma once
// Definition YAML_CPP_STATIC_DEFINE using to building YAML-CPP as static
// library (definition created by CMake or defined manually)
// Definition yaml_cpp_EXPORTS using to building YAML-CPP as dll/so library
// (definition created by CMake or defined manually)
#ifdef YAML_CPP_STATIC_DEFINE
# define YAML_CPP_API
# define YAML_CPP_NO_EXPORT
#else
# if defined(_MSC_VER) || defined(__MINGW32__) || defined(__MINGW64__)
# ifndef YAML_CPP_API
# ifdef yaml_cpp_EXPORTS
/* We are building this library */
# pragma message( "Defining YAML_CPP_API for DLL export" )
# define YAML_CPP_API __declspec(dllexport)
# else
/* We are using this library */
# pragma message( "Defining YAML_CPP_API for DLL import" )
# define YAML_CPP_API __declspec(dllimport)
# endif
# endif
# ifndef YAML_CPP_NO_EXPORT
# define YAML_CPP_NO_EXPORT
# endif
# else /* No _MSC_VER */
# ifndef YAML_CPP_API
# ifdef yaml_cpp_EXPORTS
/* We are building this library */
# define YAML_CPP_API __attribute__((visibility("default")))
# else
/* We are using this library */
# define YAML_CPP_API __attribute__((visibility("default")))
# endif
# endif
# ifndef YAML_CPP_NO_EXPORT
# define YAML_CPP_NO_EXPORT __attribute__((visibility("hidden")))
# endif
# endif /* _MSC_VER */
#endif /* YAML_CPP_STATIC_DEFINE */
#ifndef YAML_CPP_DEPRECATED
# ifdef _MSC_VER
# define YAML_CPP_DEPRECATED __declspec(deprecated)
# else
# define YAML_CPP_DEPRECATED __attribute__ ((__deprecated__))
# endif
#endif
// The following ifdef block is the standard way of creating macros which make
// exporting from a DLL simpler. All files within this DLL are compiled with the
// yaml_cpp_EXPORTS symbol defined on the command line. This symbol should not
// be defined on any project that uses this DLL. This way any other project
// whose source files include this file see YAML_CPP_API functions as being
// imported from a DLL, whereas this DLL sees symbols defined with this macro as
// being exported.
#undef YAML_CPP_API
#ifndef YAML_CPP_DEPRECATED_EXPORT
# define YAML_CPP_DEPRECATED_EXPORT YAML_CPP_API YAML_CPP_DEPRECATED
#endif
#ifdef YAML_CPP_DLL // Using or Building YAML-CPP DLL (definition defined
// manually)
#ifdef yaml_cpp_EXPORTS // Building YAML-CPP DLL (definition created by CMake
// or defined manually)
// #pragma message( "Defining YAML_CPP_API for DLL export" )
#define YAML_CPP_API __declspec(dllexport)
#else // yaml_cpp_EXPORTS
// #pragma message( "Defining YAML_CPP_API for DLL import" )
#define YAML_CPP_API __declspec(dllimport)
#endif // yaml_cpp_EXPORTS
#else // YAML_CPP_DLL
#define YAML_CPP_API
#endif // YAML_CPP_DLL
#ifndef YAML_CPP_DEPRECATED_NO_EXPORT
# define YAML_CPP_DEPRECATED_NO_EXPORT YAML_CPP_NO_EXPORT YAML_CPP_DEPRECATED
#endif
#endif // DLL_H_62B23520_7C8E_11DE_8A39_0800200C9A66
#endif /* DLL_H_62B23520_7C8E_11DE_8A39_0800200C9A66 */

View File

@@ -24,21 +24,21 @@ class EmitFromEvents : public EventHandler {
public:
EmitFromEvents(Emitter& emitter);
virtual void OnDocumentStart(const Mark& mark);
virtual void OnDocumentEnd();
void OnDocumentStart(const Mark& mark) override;
void OnDocumentEnd() override;
virtual void OnNull(const Mark& mark, anchor_t anchor);
virtual void OnAlias(const Mark& mark, anchor_t anchor);
virtual void OnScalar(const Mark& mark, const std::string& tag,
anchor_t anchor, const std::string& value);
void OnNull(const Mark& mark, anchor_t anchor) override;
void OnAlias(const Mark& mark, anchor_t anchor) override;
void OnScalar(const Mark& mark, const std::string& tag,
anchor_t anchor, const std::string& value) override;
virtual void OnSequenceStart(const Mark& mark, const std::string& tag,
anchor_t anchor, EmitterStyle::value style);
virtual void OnSequenceEnd();
void OnSequenceStart(const Mark& mark, const std::string& tag,
anchor_t anchor, EmitterStyle::value style) override;
void OnSequenceEnd() override;
virtual void OnMapStart(const Mark& mark, const std::string& tag,
anchor_t anchor, EmitterStyle::value style);
virtual void OnMapEnd();
void OnMapStart(const Mark& mark, const std::string& tag,
anchor_t anchor, EmitterStyle::value style) override;
void OnMapEnd() override;
private:
void BeginNode();

View File

@@ -7,16 +7,18 @@
#pragma once
#endif
#include <cmath>
#include <cstddef>
#include <limits>
#include <memory>
#include <sstream>
#include <string>
#include <type_traits>
#include "yaml-cpp/binary.h"
#include "yaml-cpp/dll.h"
#include "yaml-cpp/emitterdef.h"
#include "yaml-cpp/emittermanip.h"
#include "yaml-cpp/noncopyable.h"
#include "yaml-cpp/null.h"
#include "yaml-cpp/ostream_wrapper.h"
@@ -28,10 +30,12 @@ struct _Null;
namespace YAML {
class EmitterState;
class YAML_CPP_API Emitter : private noncopyable {
class YAML_CPP_API Emitter {
public:
Emitter();
explicit Emitter(std::ostream& stream);
Emitter(const Emitter&) = delete;
Emitter& operator=(const Emitter&) = delete;
~Emitter();
// output
@@ -55,6 +59,7 @@ class YAML_CPP_API Emitter : private noncopyable {
bool SetPostCommentIndent(std::size_t n);
bool SetFloatPrecision(std::size_t n);
bool SetDoublePrecision(std::size_t n);
void RestoreGlobalModifiedSettings();
// local setters
Emitter& SetLocalValue(EMITTER_MANIP value);
@@ -120,6 +125,7 @@ class YAML_CPP_API Emitter : private noncopyable {
void SpaceOrIndentTo(bool requireSpace, std::size_t indent);
const char* ComputeFullBoolName(bool b) const;
const char* ComputeNullName() const;
bool CanEmitNewline() const;
private:
@@ -153,7 +159,27 @@ inline Emitter& Emitter::WriteStreamable(T value) {
std::stringstream stream;
SetStreamablePrecision<T>(stream);
stream << value;
bool special = false;
if (std::is_floating_point<T>::value) {
if ((std::numeric_limits<T>::has_quiet_NaN ||
std::numeric_limits<T>::has_signaling_NaN) &&
std::isnan(value)) {
special = true;
stream << ".nan";
} else if (std::numeric_limits<T>::has_infinity && std::isinf(value)) {
special = true;
if (std::signbit(value)) {
stream << "-.inf";
} else {
stream << ".inf";
}
}
}
if (!special) {
stream << value;
}
m_stream << stream.str();
StartedScalar();
@@ -250,6 +276,6 @@ inline Emitter& operator<<(Emitter& emitter, _Indent indent) {
inline Emitter& operator<<(Emitter& emitter, _Precision precision) {
return emitter.SetLocalPrecision(precision);
}
}
} // namespace YAML
#endif // EMITTER_H_62B23520_7C8E_11DE_8A39_0800200C9A66

View File

@@ -27,6 +27,12 @@ enum EMITTER_MANIP {
DoubleQuoted,
Literal,
// null manipulators
LowerNull,
UpperNull,
CamelNull,
TildeNull,
// bool manipulators
YesNoBool, // yes, no
TrueFalseBool, // true, false
@@ -37,10 +43,6 @@ enum EMITTER_MANIP {
LongBool, // yes, On
ShortBool, // y, t
// null manipulators
NullAsTilde, // ~
NullAsNull, // null
// int manipulators
Dec,
Hex,
@@ -79,14 +81,14 @@ struct _Alias {
std::string content;
};
inline _Alias Alias(const std::string content) { return _Alias(content); }
inline _Alias Alias(const std::string& content) { return _Alias(content); }
struct _Anchor {
_Anchor(const std::string& content_) : content(content_) {}
std::string content;
};
inline _Anchor Anchor(const std::string content) { return _Anchor(content); }
inline _Anchor Anchor(const std::string& content) { return _Anchor(content); }
struct _Tag {
struct Type {
@@ -101,11 +103,11 @@ struct _Tag {
Type::value type;
};
inline _Tag VerbatimTag(const std::string content) {
inline _Tag VerbatimTag(const std::string& content) {
return _Tag("", content, _Tag::Type::Verbatim);
}
inline _Tag LocalTag(const std::string content) {
inline _Tag LocalTag(const std::string& content) {
return _Tag("", content, _Tag::Type::PrimaryHandle);
}
@@ -113,7 +115,7 @@ inline _Tag LocalTag(const std::string& prefix, const std::string content) {
return _Tag(prefix, content, _Tag::Type::NamedHandle);
}
inline _Tag SecondaryTag(const std::string content) {
inline _Tag SecondaryTag(const std::string& content) {
return _Tag("", content, _Tag::Type::NamedHandle);
}
@@ -122,7 +124,7 @@ struct _Comment {
std::string content;
};
inline _Comment Comment(const std::string content) { return _Comment(content); }
inline _Comment Comment(const std::string& content) { return _Comment(content); }
struct _Precision {
_Precision(int floatPrecision_, int doublePrecision_)

View File

@@ -17,7 +17,7 @@ struct Mark;
class EventHandler {
public:
virtual ~EventHandler() {}
virtual ~EventHandler() = default;
virtual void OnDocumentStart(const Mark& mark) = 0;
virtual void OnDocumentEnd() = 0;
@@ -34,7 +34,12 @@ class EventHandler {
virtual void OnMapStart(const Mark& mark, const std::string& tag,
anchor_t anchor, EmitterStyle::value style) = 0;
virtual void OnMapEnd() = 0;
virtual void OnAnchor(const Mark& /*mark*/,
const std::string& /*anchor_name*/) {
// empty default implementation for compatibility
}
};
}
} // namespace YAML
#endif // EVENTHANDLER_H_62B23520_7C8E_11DE_8A39_0800200C9A66

View File

@@ -7,19 +7,8 @@
#pragma once
#endif
#ifndef NOEXCEPT
#ifdef _MSC_VER
#ifdef _NOEXCEPT
#define NOEXCEPT _NOEXCEPT
#else
#define NOEXCEPT
#endif // ifdef _NOEXCEPT
#else
#define NOEXCEPT noexcept
#endif // ifdef _MSC_VER
#endif // ifdef NOEXCEPT
#include "yaml-cpp/mark.h"
#include "yaml-cpp/noexcept.h"
#include "yaml-cpp/traits.h"
#include <sstream>
#include <stdexcept>
@@ -76,7 +65,7 @@ const char* const ZERO_INDENT_IN_BLOCK =
const char* const CHAR_IN_BLOCK = "unexpected character in block scalar";
const char* const AMBIGUOUS_ANCHOR =
"cannot assign the same alias to multiple nodes";
const char* const UNKNOWN_ANCHOR = "the referenced anchor is not defined";
const char* const UNKNOWN_ANCHOR = "the referenced anchor is not defined: ";
const char* const INVALID_NODE =
"invalid node; this may result from using a map iterator as a sequence "
@@ -111,6 +100,12 @@ inline const std::string KEY_NOT_FOUND_WITH_KEY(const std::string& key) {
return stream.str();
}
inline const std::string KEY_NOT_FOUND_WITH_KEY(const char* key) {
std::stringstream stream;
stream << KEY_NOT_FOUND << ": " << key;
return stream.str();
}
template <typename T>
inline const std::string KEY_NOT_FOUND_WITH_KEY(
const T& key, typename enable_if<is_numeric<T>>::type* = 0) {
@@ -118,13 +113,48 @@ inline const std::string KEY_NOT_FOUND_WITH_KEY(
stream << KEY_NOT_FOUND << ": " << key;
return stream.str();
}
template <typename T>
inline const std::string BAD_SUBSCRIPT_WITH_KEY(
const T&, typename disable_if<is_numeric<T>>::type* = nullptr) {
return BAD_SUBSCRIPT;
}
inline const std::string BAD_SUBSCRIPT_WITH_KEY(const std::string& key) {
std::stringstream stream;
stream << BAD_SUBSCRIPT << " (key: \"" << key << "\")";
return stream.str();
}
inline const std::string BAD_SUBSCRIPT_WITH_KEY(const char* key) {
std::stringstream stream;
stream << BAD_SUBSCRIPT << " (key: \"" << key << "\")";
return stream.str();
}
template <typename T>
inline const std::string BAD_SUBSCRIPT_WITH_KEY(
const T& key, typename enable_if<is_numeric<T>>::type* = nullptr) {
std::stringstream stream;
stream << BAD_SUBSCRIPT << " (key: \"" << key << "\")";
return stream.str();
}
inline const std::string INVALID_NODE_WITH_KEY(const std::string& key) {
std::stringstream stream;
if (key.empty()) {
return INVALID_NODE;
}
stream << "invalid node; first invalid key: \"" << key << "\"";
return stream.str();
}
} // namespace ErrorMsg
class YAML_CPP_API Exception : public std::runtime_error {
public:
Exception(const Mark& mark_, const std::string& msg_)
: std::runtime_error(build_what(mark_, msg_)), mark(mark_), msg(msg_) {}
virtual ~Exception() NOEXCEPT;
~Exception() YAML_CPP_NOEXCEPT override;
Exception(const Exception&) = default;
@@ -135,7 +165,7 @@ class YAML_CPP_API Exception : public std::runtime_error {
static const std::string build_what(const Mark& mark,
const std::string& msg) {
if (mark.is_null()) {
return msg.c_str();
return msg;
}
std::stringstream output;
@@ -150,7 +180,7 @@ class YAML_CPP_API ParserException : public Exception {
ParserException(const Mark& mark_, const std::string& msg_)
: Exception(mark_, msg_) {}
ParserException(const ParserException&) = default;
virtual ~ParserException() NOEXCEPT;
~ParserException() YAML_CPP_NOEXCEPT override;
};
class YAML_CPP_API RepresentationException : public Exception {
@@ -158,7 +188,7 @@ class YAML_CPP_API RepresentationException : public Exception {
RepresentationException(const Mark& mark_, const std::string& msg_)
: Exception(mark_, msg_) {}
RepresentationException(const RepresentationException&) = default;
virtual ~RepresentationException() NOEXCEPT;
~RepresentationException() YAML_CPP_NOEXCEPT override;
};
// representation exceptions
@@ -167,7 +197,7 @@ class YAML_CPP_API InvalidScalar : public RepresentationException {
InvalidScalar(const Mark& mark_)
: RepresentationException(mark_, ErrorMsg::INVALID_SCALAR) {}
InvalidScalar(const InvalidScalar&) = default;
virtual ~InvalidScalar() NOEXCEPT;
~InvalidScalar() YAML_CPP_NOEXCEPT override;
};
class YAML_CPP_API KeyNotFound : public RepresentationException {
@@ -177,7 +207,7 @@ class YAML_CPP_API KeyNotFound : public RepresentationException {
: RepresentationException(mark_, ErrorMsg::KEY_NOT_FOUND_WITH_KEY(key_)) {
}
KeyNotFound(const KeyNotFound&) = default;
virtual ~KeyNotFound() NOEXCEPT;
~KeyNotFound() YAML_CPP_NOEXCEPT override;
};
template <typename T>
@@ -185,7 +215,7 @@ class YAML_CPP_API TypedKeyNotFound : public KeyNotFound {
public:
TypedKeyNotFound(const Mark& mark_, const T& key_)
: KeyNotFound(mark_, key_), key(key_) {}
virtual ~TypedKeyNotFound() NOEXCEPT {}
~TypedKeyNotFound() YAML_CPP_NOEXCEPT override = default;
T key;
};
@@ -198,10 +228,11 @@ inline TypedKeyNotFound<T> MakeTypedKeyNotFound(const Mark& mark,
class YAML_CPP_API InvalidNode : public RepresentationException {
public:
InvalidNode()
: RepresentationException(Mark::null_mark(), ErrorMsg::INVALID_NODE) {}
InvalidNode(const std::string& key)
: RepresentationException(Mark::null_mark(),
ErrorMsg::INVALID_NODE_WITH_KEY(key)) {}
InvalidNode(const InvalidNode&) = default;
virtual ~InvalidNode() NOEXCEPT;
~InvalidNode() YAML_CPP_NOEXCEPT override;
};
class YAML_CPP_API BadConversion : public RepresentationException {
@@ -209,7 +240,7 @@ class YAML_CPP_API BadConversion : public RepresentationException {
explicit BadConversion(const Mark& mark_)
: RepresentationException(mark_, ErrorMsg::BAD_CONVERSION) {}
BadConversion(const BadConversion&) = default;
virtual ~BadConversion() NOEXCEPT;
~BadConversion() YAML_CPP_NOEXCEPT override;
};
template <typename T>
@@ -223,15 +254,16 @@ class YAML_CPP_API BadDereference : public RepresentationException {
BadDereference()
: RepresentationException(Mark::null_mark(), ErrorMsg::BAD_DEREFERENCE) {}
BadDereference(const BadDereference&) = default;
virtual ~BadDereference() NOEXCEPT;
~BadDereference() YAML_CPP_NOEXCEPT override;
};
class YAML_CPP_API BadSubscript : public RepresentationException {
public:
BadSubscript()
: RepresentationException(Mark::null_mark(), ErrorMsg::BAD_SUBSCRIPT) {}
template <typename Key>
BadSubscript(const Mark& mark_, const Key& key)
: RepresentationException(mark_, ErrorMsg::BAD_SUBSCRIPT_WITH_KEY(key)) {}
BadSubscript(const BadSubscript&) = default;
virtual ~BadSubscript() NOEXCEPT;
~BadSubscript() YAML_CPP_NOEXCEPT override;
};
class YAML_CPP_API BadPushback : public RepresentationException {
@@ -239,7 +271,7 @@ class YAML_CPP_API BadPushback : public RepresentationException {
BadPushback()
: RepresentationException(Mark::null_mark(), ErrorMsg::BAD_PUSHBACK) {}
BadPushback(const BadPushback&) = default;
virtual ~BadPushback() NOEXCEPT;
~BadPushback() YAML_CPP_NOEXCEPT override;
};
class YAML_CPP_API BadInsert : public RepresentationException {
@@ -247,7 +279,7 @@ class YAML_CPP_API BadInsert : public RepresentationException {
BadInsert()
: RepresentationException(Mark::null_mark(), ErrorMsg::BAD_INSERT) {}
BadInsert(const BadInsert&) = default;
virtual ~BadInsert() NOEXCEPT;
~BadInsert() YAML_CPP_NOEXCEPT override;
};
class YAML_CPP_API EmitterException : public Exception {
@@ -255,15 +287,17 @@ class YAML_CPP_API EmitterException : public Exception {
EmitterException(const std::string& msg_)
: Exception(Mark::null_mark(), msg_) {}
EmitterException(const EmitterException&) = default;
virtual ~EmitterException() NOEXCEPT;
~EmitterException() YAML_CPP_NOEXCEPT override;
};
class YAML_CPP_API BadFile : public Exception {
public:
BadFile() : Exception(Mark::null_mark(), ErrorMsg::BAD_FILE) {}
explicit BadFile(const std::string& filename)
: Exception(Mark::null_mark(),
std::string(ErrorMsg::BAD_FILE) + ": " + filename) {}
BadFile(const BadFile&) = default;
virtual ~BadFile() NOEXCEPT;
~BadFile() YAML_CPP_NOEXCEPT override;
};
}
} // namespace YAML
#endif // EXCEPTIONS_H_62B23520_7C8E_11DE_8A39_0800200C9A66

View File

@@ -8,10 +8,14 @@
#endif
#include <array>
#include <cmath>
#include <limits>
#include <list>
#include <map>
#include <unordered_map>
#include <sstream>
#include <type_traits>
#include <valarray>
#include <vector>
#include "yaml-cpp/binary.h"
@@ -21,6 +25,7 @@
#include "yaml-cpp/node/type.h"
#include "yaml-cpp/null.h"
namespace YAML {
class Binary;
struct _Null;
@@ -71,12 +76,17 @@ struct convert<std::string> {
// C-strings can only be encoded
template <>
struct convert<const char*> {
static Node encode(const char*& rhs) { return Node(rhs); }
static Node encode(const char* rhs) { return Node(rhs); }
};
template <>
struct convert<char*> {
static Node encode(const char* rhs) { return Node(rhs); }
};
template <std::size_t N>
struct convert<const char[N]> {
static Node encode(const char(&rhs)[N]) { return Node(rhs); }
struct convert<char[N]> {
static Node encode(const char* rhs) { return Node(rhs); }
};
template <>
@@ -88,42 +98,98 @@ struct convert<_Null> {
}
};
#define YAML_DEFINE_CONVERT_STREAMABLE(type, negative_op) \
template <> \
struct convert<type> { \
static Node encode(const type& rhs) { \
std::stringstream stream; \
stream.precision(std::numeric_limits<type>::digits10 + 1); \
stream << rhs; \
return Node(stream.str()); \
} \
\
static bool decode(const Node& node, type& rhs) { \
if (node.Type() != NodeType::Scalar) \
return false; \
const std::string& input = node.Scalar(); \
std::stringstream stream(input); \
stream.unsetf(std::ios::dec); \
if ((stream >> std::noskipws >> rhs) && (stream >> std::ws).eof()) \
return true; \
if (std::numeric_limits<type>::has_infinity) { \
if (conversion::IsInfinity(input)) { \
rhs = std::numeric_limits<type>::infinity(); \
return true; \
} else if (conversion::IsNegativeInfinity(input)) { \
rhs = negative_op std::numeric_limits<type>::infinity(); \
return true; \
} \
} \
\
if (std::numeric_limits<type>::has_quiet_NaN && \
conversion::IsNaN(input)) { \
rhs = std::numeric_limits<type>::quiet_NaN(); \
return true; \
} \
\
return false; \
} \
namespace conversion {
template <typename T>
typename std::enable_if< std::is_floating_point<T>::value, void>::type
inner_encode(const T& rhs, std::stringstream& stream){
if (std::isnan(rhs)) {
stream << ".nan";
} else if (std::isinf(rhs)) {
if (std::signbit(rhs)) {
stream << "-.inf";
} else {
stream << ".inf";
}
} else {
stream << rhs;
}
}
template <typename T>
typename std::enable_if<!std::is_floating_point<T>::value, void>::type
inner_encode(const T& rhs, std::stringstream& stream){
stream << rhs;
}
template <typename T>
typename std::enable_if<(std::is_same<T, unsigned char>::value ||
std::is_same<T, signed char>::value), bool>::type
ConvertStreamTo(std::stringstream& stream, T& rhs) {
int num;
if ((stream >> std::noskipws >> num) && (stream >> std::ws).eof()) {
if (num >= (std::numeric_limits<T>::min)() &&
num <= (std::numeric_limits<T>::max)()) {
rhs = static_cast<T>(num);
return true;
}
}
return false;
}
template <typename T>
typename std::enable_if<!(std::is_same<T, unsigned char>::value ||
std::is_same<T, signed char>::value), bool>::type
ConvertStreamTo(std::stringstream& stream, T& rhs) {
if ((stream >> std::noskipws >> rhs) && (stream >> std::ws).eof()) {
return true;
}
return false;
}
}
#define YAML_DEFINE_CONVERT_STREAMABLE(type, negative_op) \
template <> \
struct convert<type> { \
\
static Node encode(const type& rhs) { \
std::stringstream stream; \
stream.precision(std::numeric_limits<type>::max_digits10); \
conversion::inner_encode(rhs, stream); \
return Node(stream.str()); \
} \
\
static bool decode(const Node& node, type& rhs) { \
if (node.Type() != NodeType::Scalar) { \
return false; \
} \
const std::string& input = node.Scalar(); \
std::stringstream stream(input); \
stream.unsetf(std::ios::dec); \
if ((stream.peek() == '-') && std::is_unsigned<type>::value) { \
return false; \
} \
if (conversion::ConvertStreamTo(stream, rhs)) { \
return true; \
} \
if (std::numeric_limits<type>::has_infinity) { \
if (conversion::IsInfinity(input)) { \
rhs = std::numeric_limits<type>::infinity(); \
return true; \
} else if (conversion::IsNegativeInfinity(input)) { \
rhs = negative_op std::numeric_limits<type>::infinity(); \
return true; \
} \
} \
\
if (std::numeric_limits<type>::has_quiet_NaN) { \
if (conversion::IsNaN(input)) { \
rhs = std::numeric_limits<type>::quiet_NaN(); \
return true; \
} \
} \
\
return false; \
} \
}
#define YAML_DEFINE_CONVERT_STREAMABLE_SIGNED(type) \
@@ -162,81 +228,104 @@ struct convert<bool> {
};
// std::map
template <typename K, typename V>
struct convert<std::map<K, V>> {
static Node encode(const std::map<K, V>& rhs) {
template <typename K, typename V, typename C, typename A>
struct convert<std::map<K, V, C, A>> {
static Node encode(const std::map<K, V, C, A>& rhs) {
Node node(NodeType::Map);
for (typename std::map<K, V>::const_iterator it = rhs.begin();
it != rhs.end(); ++it)
node.force_insert(it->first, it->second);
for (const auto& element : rhs)
node.force_insert(element.first, element.second);
return node;
}
static bool decode(const Node& node, std::map<K, V>& rhs) {
static bool decode(const Node& node, std::map<K, V, C, A>& rhs) {
if (!node.IsMap())
return false;
rhs.clear();
for (const_iterator it = node.begin(); it != node.end(); ++it)
for (const auto& element : node)
#if defined(__GNUC__) && __GNUC__ < 4
// workaround for GCC 3:
rhs[it->first.template as<K>()] = it->second.template as<V>();
rhs[element.first.template as<K>()] = element.second.template as<V>();
#else
rhs[it->first.as<K>()] = it->second.as<V>();
rhs[element.first.as<K>()] = element.second.as<V>();
#endif
return true;
}
};
// std::unordered_map
template <typename K, typename V, typename H, typename P, typename A>
struct convert<std::unordered_map<K, V, H, P, A>> {
static Node encode(const std::unordered_map<K, V, H, P, A>& rhs) {
Node node(NodeType::Map);
for (const auto& element : rhs)
node.force_insert(element.first, element.second);
return node;
}
static bool decode(const Node& node, std::unordered_map<K, V, H, P, A>& rhs) {
if (!node.IsMap())
return false;
rhs.clear();
for (const auto& element : node)
#if defined(__GNUC__) && __GNUC__ < 4
// workaround for GCC 3:
rhs[element.first.template as<K>()] = element.second.template as<V>();
#else
rhs[element.first.as<K>()] = element.second.as<V>();
#endif
return true;
}
};
// std::vector
template <typename T>
struct convert<std::vector<T>> {
static Node encode(const std::vector<T>& rhs) {
template <typename T, typename A>
struct convert<std::vector<T, A>> {
static Node encode(const std::vector<T, A>& rhs) {
Node node(NodeType::Sequence);
for (typename std::vector<T>::const_iterator it = rhs.begin();
it != rhs.end(); ++it)
node.push_back(*it);
for (const auto& element : rhs)
node.push_back(element);
return node;
}
static bool decode(const Node& node, std::vector<T>& rhs) {
static bool decode(const Node& node, std::vector<T, A>& rhs) {
if (!node.IsSequence())
return false;
rhs.clear();
for (const_iterator it = node.begin(); it != node.end(); ++it)
for (const auto& element : node)
#if defined(__GNUC__) && __GNUC__ < 4
// workaround for GCC 3:
rhs.push_back(it->template as<T>());
rhs.push_back(element.template as<T>());
#else
rhs.push_back(it->as<T>());
rhs.push_back(element.as<T>());
#endif
return true;
}
};
// std::list
template <typename T>
struct convert<std::list<T>> {
static Node encode(const std::list<T>& rhs) {
template <typename T, typename A>
struct convert<std::list<T,A>> {
static Node encode(const std::list<T,A>& rhs) {
Node node(NodeType::Sequence);
for (typename std::list<T>::const_iterator it = rhs.begin();
it != rhs.end(); ++it)
node.push_back(*it);
for (const auto& element : rhs)
node.push_back(element);
return node;
}
static bool decode(const Node& node, std::list<T>& rhs) {
static bool decode(const Node& node, std::list<T,A>& rhs) {
if (!node.IsSequence())
return false;
rhs.clear();
for (const_iterator it = node.begin(); it != node.end(); ++it)
for (const auto& element : node)
#if defined(__GNUC__) && __GNUC__ < 4
// workaround for GCC 3:
rhs.push_back(it->template as<T>());
rhs.push_back(element.template as<T>());
#else
rhs.push_back(it->as<T>());
rhs.push_back(element.as<T>());
#endif
return true;
}
@@ -275,6 +364,37 @@ struct convert<std::array<T, N>> {
}
};
// std::valarray
template <typename T>
struct convert<std::valarray<T>> {
static Node encode(const std::valarray<T>& rhs) {
Node node(NodeType::Sequence);
for (const auto& element : rhs) {
node.push_back(element);
}
return node;
}
static bool decode(const Node& node, std::valarray<T>& rhs) {
if (!node.IsSequence()) {
return false;
}
rhs.resize(node.size());
for (auto i = 0u; i < node.size(); ++i) {
#if defined(__GNUC__) && __GNUC__ < 4
// workaround for GCC 3:
rhs[i] = node[i].template as<T>();
#else
rhs[i] = node[i].as<T>();
#endif
}
return true;
}
};
// std::pair
template <typename T, typename U>
struct convert<std::pair<T, U>> {

View File

@@ -9,6 +9,8 @@
#include "yaml-cpp/node/detail/node.h"
#include "yaml-cpp/node/detail/node_data.h"
#include <algorithm>
#include <type_traits>
namespace YAML {
@@ -17,7 +19,7 @@ template <typename Key, typename Enable = void>
struct get_idx {
static node* get(const std::vector<node*>& /* sequence */,
const Key& /* key */, shared_memory_holder /* pMemory */) {
return 0;
return nullptr;
}
};
@@ -27,13 +29,13 @@ struct get_idx<Key,
!std::is_same<Key, bool>::value>::type> {
static node* get(const std::vector<node*>& sequence, const Key& key,
shared_memory_holder /* pMemory */) {
return key < sequence.size() ? sequence[key] : 0;
return key < sequence.size() ? sequence[key] : nullptr;
}
static node* get(std::vector<node*>& sequence, const Key& key,
shared_memory_holder pMemory) {
if (key > sequence.size() || (key > 0 && !sequence[key-1]->is_defined()))
return 0;
if (key > sequence.size() || (key > 0 && !sequence[key - 1]->is_defined()))
return nullptr;
if (key == sequence.size())
sequence.push_back(&pMemory->create_node());
return sequence[key];
@@ -46,13 +48,51 @@ struct get_idx<Key, typename std::enable_if<std::is_signed<Key>::value>::type> {
shared_memory_holder pMemory) {
return key >= 0 ? get_idx<std::size_t>::get(
sequence, static_cast<std::size_t>(key), pMemory)
: 0;
: nullptr;
}
static node* get(std::vector<node*>& sequence, const Key& key,
shared_memory_holder pMemory) {
return key >= 0 ? get_idx<std::size_t>::get(
sequence, static_cast<std::size_t>(key), pMemory)
: 0;
: nullptr;
}
};
template <typename Key, typename Enable = void>
struct remove_idx {
static bool remove(std::vector<node*>&, const Key&, std::size_t&) {
return false;
}
};
template <typename Key>
struct remove_idx<
Key, typename std::enable_if<std::is_unsigned<Key>::value &&
!std::is_same<Key, bool>::value>::type> {
static bool remove(std::vector<node*>& sequence, const Key& key,
std::size_t& seqSize) {
if (key >= sequence.size()) {
return false;
} else {
sequence.erase(sequence.begin() + key);
if (seqSize > key) {
--seqSize;
}
return true;
}
}
};
template <typename Key>
struct remove_idx<Key,
typename std::enable_if<std::is_signed<Key>::value>::type> {
static bool remove(std::vector<node*>& sequence, const Key& key,
std::size_t& seqSize) {
return key >= 0 ? remove_idx<std::size_t>::remove(
sequence, static_cast<std::size_t>(key), seqSize)
: false;
}
};
@@ -66,7 +106,11 @@ inline bool node::equals(const T& rhs, shared_memory_holder pMemory) {
}
inline bool node::equals(const char* rhs, shared_memory_holder pMemory) {
return equals<std::string>(rhs, pMemory);
std::string lhs;
if (convert<std::string>::decode(Node(*this, std::move(pMemory)), lhs)) {
return lhs == rhs;
}
return false;
}
// indexing
@@ -78,22 +122,20 @@ inline node* node_data::get(const Key& key,
break;
case NodeType::Undefined:
case NodeType::Null:
return NULL;
return nullptr;
case NodeType::Sequence:
if (node* pNode = get_idx<Key>::get(m_sequence, key, pMemory))
return pNode;
return NULL;
return nullptr;
case NodeType::Scalar:
throw BadSubscript();
throw BadSubscript(m_mark, key);
}
for (node_map::const_iterator it = m_map.begin(); it != m_map.end(); ++it) {
if (it->first->equals(key, pMemory)) {
return it->second;
}
}
auto it = std::find_if(m_map.begin(), m_map.end(), [&](const kv_pair m) {
return m.first->equals(key, pMemory);
});
return NULL;
return it != m_map.end() ? it->second : nullptr;
}
template <typename Key>
@@ -112,13 +154,15 @@ inline node& node_data::get(const Key& key, shared_memory_holder pMemory) {
convert_to_map(pMemory);
break;
case NodeType::Scalar:
throw BadSubscript();
throw BadSubscript(m_mark, key);
}
for (node_map::const_iterator it = m_map.begin(); it != m_map.end(); ++it) {
if (it->first->equals(key, pMemory)) {
return *it->second;
}
auto it = std::find_if(m_map.begin(), m_map.end(), [&](const kv_pair m) {
return m.first->equals(key, pMemory);
});
if (it != m_map.end()) {
return *it->second;
}
node& k = convert_to_node(key, pMemory);
@@ -129,20 +173,26 @@ inline node& node_data::get(const Key& key, shared_memory_holder pMemory) {
template <typename Key>
inline bool node_data::remove(const Key& key, shared_memory_holder pMemory) {
if (m_type != NodeType::Map)
return false;
for (kv_pairs::iterator it = m_undefinedPairs.begin();
it != m_undefinedPairs.end();) {
kv_pairs::iterator jt = std::next(it);
if (it->first->equals(key, pMemory))
m_undefinedPairs.erase(it);
it = jt;
if (m_type == NodeType::Sequence) {
return remove_idx<Key>::remove(m_sequence, key, m_seqSize);
}
for (node_map::iterator it = m_map.begin(); it != m_map.end(); ++it) {
if (it->first->equals(key, pMemory)) {
m_map.erase(it);
if (m_type == NodeType::Map) {
kv_pairs::iterator it = m_undefinedPairs.begin();
while (it != m_undefinedPairs.end()) {
kv_pairs::iterator jt = std::next(it);
if (it->first->equals(key, pMemory)) {
m_undefinedPairs.erase(it);
}
it = jt;
}
auto iter = std::find_if(m_map.begin(), m_map.end(), [&](const kv_pair m) {
return m.first->equals(key, pMemory);
});
if (iter != m_map.end()) {
m_map.erase(iter);
return true;
}
}

View File

@@ -8,24 +8,25 @@
#endif
#include "yaml-cpp/dll.h"
#include "yaml-cpp/node/ptr.h"
#include "yaml-cpp/node/detail/node_iterator.h"
#include "yaml-cpp/node/node.h"
#include "yaml-cpp/node/ptr.h"
#include <cstddef>
#include <iterator>
namespace YAML {
namespace detail {
struct iterator_value;
template <typename V>
class iterator_base : public std::iterator<std::forward_iterator_tag, V,
std::ptrdiff_t, V*, V> {
class iterator_base {
private:
template <typename>
friend class iterator_base;
struct enabler {};
typedef node_iterator base_type;
using base_type = node_iterator;
struct proxy {
explicit proxy(const V& x) : m_ref(x) {}
@@ -36,7 +37,11 @@ class iterator_base : public std::iterator<std::forward_iterator_tag, V,
};
public:
typedef typename iterator_base::value_type value_type;
using iterator_category = std::forward_iterator_tag;
using value_type = V;
using difference_type = std::ptrdiff_t;
using pointer = V*;
using reference = V;
public:
iterator_base() : m_iterator(), m_pMemory() {}
@@ -85,7 +90,7 @@ class iterator_base : public std::iterator<std::forward_iterator_tag, V,
base_type m_iterator;
shared_memory_holder m_pMemory;
};
}
}
} // namespace detail
} // namespace YAML
#endif // VALUE_DETAIL_ITERATOR_H_62B23520_7C8E_11DE_8A39_0800200C9A66

View File

@@ -20,8 +20,8 @@ template <typename V>
class iterator_base;
}
typedef detail::iterator_base<detail::iterator_value> iterator;
typedef detail::iterator_base<const detail::iterator_value> const_iterator;
using iterator = detail::iterator_base<detail::iterator_value>;
using const_iterator = detail::iterator_base<const detail::iterator_value>;
}
#endif // VALUE_DETAIL_ITERATOR_FWD_H_62B23520_7C8E_11DE_8A39_0800200C9A66

View File

@@ -22,11 +22,12 @@ namespace YAML {
namespace detail {
class YAML_CPP_API memory {
public:
memory() : m_nodes{} {}
node& create_node();
void merge(const memory& rhs);
private:
typedef std::set<shared_node> Nodes;
using Nodes = std::set<shared_node>;
Nodes m_nodes;
};
@@ -40,7 +41,7 @@ class YAML_CPP_API memory_holder {
private:
shared_memory m_pMemory;
};
}
}
} // namespace detail
} // namespace YAML
#endif // VALUE_DETAIL_MEMORY_H_62B23520_7C8E_11DE_8A39_0800200C9A66

View File

@@ -7,18 +7,24 @@
#pragma once
#endif
#include "yaml-cpp/emitterstyle.h"
#include "yaml-cpp/dll.h"
#include "yaml-cpp/node/type.h"
#include "yaml-cpp/node/ptr.h"
#include "yaml-cpp/emitterstyle.h"
#include "yaml-cpp/node/detail/node_ref.h"
#include "yaml-cpp/node/ptr.h"
#include "yaml-cpp/node/type.h"
#include <set>
#include <atomic>
namespace YAML {
namespace detail {
class node {
private:
struct less {
bool operator ()(const node* l, const node* r) const {return l->m_index < r->m_index;}
};
public:
node() : m_pRef(new node_ref) {}
node() : m_pRef(new node_ref), m_dependencies{}, m_index{} {}
node(const node&) = delete;
node& operator=(const node&) = delete;
@@ -42,9 +48,8 @@ class node {
return;
m_pRef->mark_defined();
for (nodes::iterator it = m_dependencies.begin();
it != m_dependencies.end(); ++it)
(*it)->mark_defined();
for (node* dependency : m_dependencies)
dependency->mark_defined();
m_dependencies.clear();
}
@@ -109,6 +114,7 @@ class node {
void push_back(node& input, shared_memory_holder pMemory) {
m_pRef->push_back(input, pMemory);
input.add_dependency(*this);
m_index = m_amount.fetch_add(1);
}
void insert(node& key, node& value, shared_memory_holder pMemory) {
m_pRef->insert(key, value, pMemory);
@@ -120,7 +126,7 @@ class node {
template <typename Key>
node* get(const Key& key, shared_memory_holder pMemory) const {
// NOTE: this returns a non-const node so that the top-level Node can wrap
// it, and returns a pointer so that it can be NULL (if there is no such
// it, and returns a pointer so that it can be nullptr (if there is no such
// key).
return static_cast<const node_ref&>(*m_pRef).get(key, pMemory);
}
@@ -137,7 +143,7 @@ class node {
node* get(node& key, shared_memory_holder pMemory) const {
// NOTE: this returns a non-const node so that the top-level Node can wrap
// it, and returns a pointer so that it can be NULL (if there is no such
// it, and returns a pointer so that it can be nullptr (if there is no such
// key).
return static_cast<const node_ref&>(*m_pRef).get(key, pMemory);
}
@@ -160,10 +166,12 @@ class node {
private:
shared_node_ref m_pRef;
typedef std::set<node*> nodes;
using nodes = std::set<node*, less>;
nodes m_dependencies;
size_t m_index;
static YAML_CPP_API std::atomic<size_t> m_amount;
};
}
}
} // namespace detail
} // namespace YAML
#endif // NODE_DETAIL_NODE_H_62B23520_7C8E_11DE_8A39_0800200C9A66

View File

@@ -60,8 +60,8 @@ class YAML_CPP_API node_data {
node_iterator end();
// sequence
void push_back(node& node, shared_memory_holder pMemory);
void insert(node& key, node& value, shared_memory_holder pMemory);
void push_back(node& node, const shared_memory_holder& pMemory);
void insert(node& key, node& value, const shared_memory_holder& pMemory);
// indexing
template <typename Key>
@@ -71,9 +71,9 @@ class YAML_CPP_API node_data {
template <typename Key>
bool remove(const Key& key, shared_memory_holder pMemory);
node* get(node& key, shared_memory_holder pMemory) const;
node& get(node& key, shared_memory_holder pMemory);
bool remove(node& key, shared_memory_holder pMemory);
node* get(node& key, const shared_memory_holder& pMemory) const;
node& get(node& key, const shared_memory_holder& pMemory);
bool remove(node& key, const shared_memory_holder& pMemory);
// map
template <typename Key, typename Value>
@@ -81,7 +81,7 @@ class YAML_CPP_API node_data {
shared_memory_holder pMemory);
public:
static std::string empty_scalar;
static const std::string& empty_scalar();
private:
void compute_seq_size() const;
@@ -91,8 +91,8 @@ class YAML_CPP_API node_data {
void reset_map();
void insert_map_pair(node& key, node& value);
void convert_to_map(shared_memory_holder pMemory);
void convert_sequence_to_map(shared_memory_holder pMemory);
void convert_to_map(const shared_memory_holder& pMemory);
void convert_sequence_to_map(const shared_memory_holder& pMemory);
template <typename T>
static node& convert_to_node(const T& rhs, shared_memory_holder pMemory);
@@ -108,17 +108,17 @@ class YAML_CPP_API node_data {
std::string m_scalar;
// sequence
typedef std::vector<node*> node_seq;
using node_seq = std::vector<node *>;
node_seq m_sequence;
mutable std::size_t m_seqSize;
// map
typedef std::vector<std::pair<node*, node*>> node_map;
using node_map = std::vector<std::pair<node*, node*>>;
node_map m_map;
typedef std::pair<node*, node*> kv_pair;
typedef std::list<kv_pair> kv_pairs;
using kv_pair = std::pair<node*, node*>;
using kv_pairs = std::list<kv_pair>;
mutable kv_pairs m_undefinedPairs;
};
}

View File

@@ -19,16 +19,16 @@
namespace YAML {
namespace detail {
struct iterator_type {
enum value { None, Sequence, Map };
enum value { NoneType, Sequence, Map };
};
template <typename V>
struct node_iterator_value : public std::pair<V*, V*> {
typedef std::pair<V*, V*> kv;
using kv = std::pair<V*, V*>;
node_iterator_value() : kv(), pNode(0) {}
node_iterator_value() : kv(), pNode(nullptr) {}
explicit node_iterator_value(V& rhs) : kv(), pNode(&rhs) {}
explicit node_iterator_value(V& key, V& value) : kv(&key, &value), pNode(0) {}
explicit node_iterator_value(V& key, V& value) : kv(&key, &value), pNode(nullptr) {}
V& operator*() const { return *pNode; }
V& operator->() const { return *pNode; }
@@ -36,26 +36,23 @@ struct node_iterator_value : public std::pair<V*, V*> {
V* pNode;
};
typedef std::vector<node*> node_seq;
typedef std::vector<std::pair<node*, node*>> node_map;
using node_seq = std::vector<node *>;
using node_map = std::vector<std::pair<node*, node*>>;
template <typename V>
struct node_iterator_type {
typedef node_seq::iterator seq;
typedef node_map::iterator map;
using seq = node_seq::iterator;
using map = node_map::iterator;
};
template <typename V>
struct node_iterator_type<const V> {
typedef node_seq::const_iterator seq;
typedef node_map::const_iterator map;
using seq = node_seq::const_iterator;
using map = node_map::const_iterator;
};
template <typename V>
class node_iterator_base
: public std::iterator<std::forward_iterator_tag, node_iterator_value<V>,
std::ptrdiff_t, node_iterator_value<V>*,
node_iterator_value<V>> {
class node_iterator_base {
private:
struct enabler {};
@@ -68,12 +65,16 @@ class node_iterator_base
};
public:
typedef typename node_iterator_type<V>::seq SeqIter;
typedef typename node_iterator_type<V>::map MapIter;
typedef node_iterator_value<V> value_type;
using iterator_category = std::forward_iterator_tag;
using value_type = node_iterator_value<V>;
using difference_type = std::ptrdiff_t;
using pointer = node_iterator_value<V>*;
using reference = node_iterator_value<V>;
using SeqIter = typename node_iterator_type<V>::seq;
using MapIter = typename node_iterator_type<V>::map;
node_iterator_base()
: m_type(iterator_type::None), m_seqIt(), m_mapIt(), m_mapEnd() {}
: m_type(iterator_type::NoneType), m_seqIt(), m_mapIt(), m_mapEnd() {}
explicit node_iterator_base(SeqIter seqIt)
: m_type(iterator_type::Sequence),
m_seqIt(seqIt),
@@ -105,7 +106,7 @@ class node_iterator_base
return false;
switch (m_type) {
case iterator_type::None:
case iterator_type::NoneType:
return true;
case iterator_type::Sequence:
return m_seqIt == rhs.m_seqIt;
@@ -122,7 +123,7 @@ class node_iterator_base
node_iterator_base<V>& operator++() {
switch (m_type) {
case iterator_type::None:
case iterator_type::NoneType:
break;
case iterator_type::Sequence:
++m_seqIt;
@@ -143,7 +144,7 @@ class node_iterator_base
value_type operator*() const {
switch (m_type) {
case iterator_type::None:
case iterator_type::NoneType:
return value_type();
case iterator_type::Sequence:
return value_type(**m_seqIt);
@@ -172,8 +173,8 @@ class node_iterator_base
MapIter m_mapIt, m_mapEnd;
};
typedef node_iterator_base<node> node_iterator;
typedef node_iterator_base<const node> const_node_iterator;
using node_iterator = node_iterator_base<node>;
using const_node_iterator = node_iterator_base<const node>;
}
}

View File

@@ -7,18 +7,21 @@
#pragma once
#endif
#include "yaml-cpp/node/node.h"
#include "yaml-cpp/node/iterator.h"
#include "yaml-cpp/exceptions.h"
#include "yaml-cpp/node/detail/memory.h"
#include "yaml-cpp/node/detail/node.h"
#include "yaml-cpp/exceptions.h"
#include "yaml-cpp/node/iterator.h"
#include "yaml-cpp/node/node.h"
#include <sstream>
#include <string>
namespace YAML {
inline Node::Node() : m_isValid(true), m_pNode(NULL) {}
inline Node::Node()
: m_isValid(true), m_invalidKey{}, m_pMemory(nullptr), m_pNode(nullptr) {}
inline Node::Node(NodeType::value type)
: m_isValid(true),
m_invalidKey{},
m_pMemory(new detail::memory_holder),
m_pNode(&m_pMemory->create_node()) {
m_pNode->set_type(type);
@@ -27,6 +30,7 @@ inline Node::Node(NodeType::value type)
template <typename T>
inline Node::Node(const T& rhs)
: m_isValid(true),
m_invalidKey{},
m_pMemory(new detail::memory_holder),
m_pNode(&m_pMemory->create_node()) {
Assign(rhs);
@@ -34,24 +38,26 @@ inline Node::Node(const T& rhs)
inline Node::Node(const detail::iterator_value& rhs)
: m_isValid(rhs.m_isValid),
m_invalidKey(rhs.m_invalidKey),
m_pMemory(rhs.m_pMemory),
m_pNode(rhs.m_pNode) {}
inline Node::Node(const Node& rhs)
: m_isValid(rhs.m_isValid),
m_pMemory(rhs.m_pMemory),
m_pNode(rhs.m_pNode) {}
inline Node::Node(const Node&) = default;
inline Node::Node(Zombie) : m_isValid(false), m_pNode(NULL) {}
inline Node::Node(Zombie)
: m_isValid(false), m_invalidKey{}, m_pMemory{}, m_pNode(nullptr) {}
inline Node::Node(Zombie, const std::string& key)
: m_isValid(false), m_invalidKey(key), m_pMemory{}, m_pNode(nullptr) {}
inline Node::Node(detail::node& node, detail::shared_memory_holder pMemory)
: m_isValid(true), m_pMemory(pMemory), m_pNode(&node) {}
: m_isValid(true), m_invalidKey{}, m_pMemory(pMemory), m_pNode(&node) {}
inline Node::~Node() {}
inline Node::~Node() = default;
inline void Node::EnsureNodeExists() const {
if (!m_isValid)
throw InvalidNode();
throw InvalidNode(m_invalidKey);
if (!m_pNode) {
m_pMemory.reset(new detail::memory_holder);
m_pNode = &m_pMemory->create_node();
@@ -68,14 +74,14 @@ inline bool Node::IsDefined() const {
inline Mark Node::Mark() const {
if (!m_isValid) {
throw InvalidNode();
throw InvalidNode(m_invalidKey);
}
return m_pNode ? m_pNode->mark() : Mark::null_mark();
}
inline NodeType::value Node::Type() const {
if (!m_isValid)
throw InvalidNode();
throw InvalidNode(m_invalidKey);
return m_pNode ? m_pNode->type() : NodeType::Null;
}
@@ -104,6 +110,8 @@ struct as_if<std::string, S> {
const Node& node;
std::string operator()(const S& fallback) const {
if (node.Type() == NodeType::Null)
return "null";
if (node.Type() != NodeType::Scalar)
return fallback;
return node.Scalar();
@@ -132,6 +140,8 @@ struct as_if<std::string, void> {
const Node& node;
std::string operator()() const {
if (node.Type() == NodeType::Null)
return "null";
if (node.Type() != NodeType::Scalar)
throw TypedBadConversion<std::string>(node.Mark());
return node.Scalar();
@@ -142,7 +152,7 @@ struct as_if<std::string, void> {
template <typename T>
inline T Node::as() const {
if (!m_isValid)
throw InvalidNode();
throw InvalidNode(m_invalidKey);
return as_if<T, void>(*this)();
}
@@ -155,32 +165,28 @@ inline T Node::as(const S& fallback) const {
inline const std::string& Node::Scalar() const {
if (!m_isValid)
throw InvalidNode();
return m_pNode ? m_pNode->scalar() : detail::node_data::empty_scalar;
throw InvalidNode(m_invalidKey);
return m_pNode ? m_pNode->scalar() : detail::node_data::empty_scalar();
}
inline const std::string& Node::Tag() const {
if (!m_isValid)
throw InvalidNode();
return m_pNode ? m_pNode->tag() : detail::node_data::empty_scalar;
throw InvalidNode(m_invalidKey);
return m_pNode ? m_pNode->tag() : detail::node_data::empty_scalar();
}
inline void Node::SetTag(const std::string& tag) {
if (!m_isValid)
throw InvalidNode();
EnsureNodeExists();
m_pNode->set_tag(tag);
}
inline EmitterStyle::value Node::Style() const {
if (!m_isValid)
throw InvalidNode();
throw InvalidNode(m_invalidKey);
return m_pNode ? m_pNode->style() : EmitterStyle::Default;
}
inline void Node::SetStyle(EmitterStyle::value style) {
if (!m_isValid)
throw InvalidNode();
EnsureNodeExists();
m_pNode->set_style(style);
}
@@ -188,7 +194,7 @@ inline void Node::SetStyle(EmitterStyle::value style) {
// assignment
inline bool Node::is(const Node& rhs) const {
if (!m_isValid || !rhs.m_isValid)
throw InvalidNode();
throw InvalidNode(m_invalidKey);
if (!m_pNode || !rhs.m_pNode)
return false;
return m_pNode->is(*rhs.m_pNode);
@@ -196,15 +202,20 @@ inline bool Node::is(const Node& rhs) const {
template <typename T>
inline Node& Node::operator=(const T& rhs) {
if (!m_isValid)
throw InvalidNode();
Assign(rhs);
return *this;
}
inline Node& Node::operator=(const Node& rhs) {
if (is(rhs))
return *this;
AssignNode(rhs);
return *this;
}
inline void Node::reset(const YAML::Node& rhs) {
if (!m_isValid || !rhs.m_isValid)
throw InvalidNode();
throw InvalidNode(m_invalidKey);
m_pMemory = rhs.m_pMemory;
m_pNode = rhs.m_pNode;
}
@@ -212,44 +223,27 @@ inline void Node::reset(const YAML::Node& rhs) {
template <typename T>
inline void Node::Assign(const T& rhs) {
if (!m_isValid)
throw InvalidNode();
throw InvalidNode(m_invalidKey);
AssignData(convert<T>::encode(rhs));
}
template <>
inline void Node::Assign(const std::string& rhs) {
if (!m_isValid)
throw InvalidNode();
EnsureNodeExists();
m_pNode->set_scalar(rhs);
}
inline void Node::Assign(const char* rhs) {
if (!m_isValid)
throw InvalidNode();
EnsureNodeExists();
m_pNode->set_scalar(rhs);
}
inline void Node::Assign(char* rhs) {
if (!m_isValid)
throw InvalidNode();
EnsureNodeExists();
m_pNode->set_scalar(rhs);
}
inline Node& Node::operator=(const Node& rhs) {
if (!m_isValid || !rhs.m_isValid)
throw InvalidNode();
if (is(rhs))
return *this;
AssignNode(rhs);
return *this;
}
inline void Node::AssignData(const Node& rhs) {
if (!m_isValid || !rhs.m_isValid)
throw InvalidNode();
EnsureNodeExists();
rhs.EnsureNodeExists();
@@ -258,8 +252,8 @@ inline void Node::AssignData(const Node& rhs) {
}
inline void Node::AssignNode(const Node& rhs) {
if (!m_isValid || !rhs.m_isValid)
throw InvalidNode();
if (!m_isValid)
throw InvalidNode(m_invalidKey);
rhs.EnsureNodeExists();
if (!m_pNode) {
@@ -276,7 +270,7 @@ inline void Node::AssignNode(const Node& rhs) {
// size/iterator
inline std::size_t Node::size() const {
if (!m_isValid)
throw InvalidNode();
throw InvalidNode(m_invalidKey);
return m_pNode ? m_pNode->size() : 0;
}
@@ -309,13 +303,11 @@ inline iterator Node::end() {
template <typename T>
inline void Node::push_back(const T& rhs) {
if (!m_isValid)
throw InvalidNode();
throw InvalidNode(m_invalidKey);
push_back(Node(rhs));
}
inline void Node::push_back(const Node& rhs) {
if (!m_isValid || !rhs.m_isValid)
throw InvalidNode();
EnsureNodeExists();
rhs.EnsureNodeExists();
@@ -323,99 +315,49 @@ inline void Node::push_back(const Node& rhs) {
m_pMemory->merge(*rhs.m_pMemory);
}
// helpers for indexing
namespace detail {
template <typename T>
struct to_value_t {
explicit to_value_t(const T& t_) : t(t_) {}
const T& t;
typedef const T& return_type;
const T& operator()() const { return t; }
};
template <>
struct to_value_t<const char*> {
explicit to_value_t(const char* t_) : t(t_) {}
const char* t;
typedef std::string return_type;
const std::string operator()() const { return t; }
};
template <>
struct to_value_t<char*> {
explicit to_value_t(char* t_) : t(t_) {}
const char* t;
typedef std::string return_type;
const std::string operator()() const { return t; }
};
template <std::size_t N>
struct to_value_t<char[N]> {
explicit to_value_t(const char* t_) : t(t_) {}
const char* t;
typedef std::string return_type;
const std::string operator()() const { return t; }
};
// converts C-strings to std::strings so they can be copied
template <typename T>
inline typename to_value_t<T>::return_type to_value(const T& t) {
return to_value_t<T>(t)();
}
template<typename Key>
std::string key_to_string(const Key& key) {
return streamable_to_string<Key, is_streamable<std::stringstream, Key>::value>().impl(key);
}
// indexing
template <typename Key>
inline const Node Node::operator[](const Key& key) const {
if (!m_isValid)
throw InvalidNode();
EnsureNodeExists();
detail::node* value = static_cast<const detail::node&>(*m_pNode)
.get(detail::to_value(key), m_pMemory);
detail::node* value =
static_cast<const detail::node&>(*m_pNode).get(key, m_pMemory);
if (!value) {
return Node(ZombieNode);
return Node(ZombieNode, key_to_string(key));
}
return Node(*value, m_pMemory);
}
template <typename Key>
inline Node Node::operator[](const Key& key) {
if (!m_isValid)
throw InvalidNode();
EnsureNodeExists();
detail::node& value = m_pNode->get(detail::to_value(key), m_pMemory);
detail::node& value = m_pNode->get(key, m_pMemory);
return Node(value, m_pMemory);
}
template <typename Key>
inline bool Node::remove(const Key& key) {
if (!m_isValid)
throw InvalidNode();
EnsureNodeExists();
return m_pNode->remove(detail::to_value(key), m_pMemory);
return m_pNode->remove(key, m_pMemory);
}
inline const Node Node::operator[](const Node& key) const {
if (!m_isValid || !key.m_isValid)
throw InvalidNode();
EnsureNodeExists();
key.EnsureNodeExists();
m_pMemory->merge(*key.m_pMemory);
detail::node* value =
static_cast<const detail::node&>(*m_pNode).get(*key.m_pNode, m_pMemory);
if (!value) {
return Node(ZombieNode);
return Node(ZombieNode, key_to_string(key));
}
return Node(*value, m_pMemory);
}
inline Node Node::operator[](const Node& key) {
if (!m_isValid || !key.m_isValid)
throw InvalidNode();
EnsureNodeExists();
key.EnsureNodeExists();
m_pMemory->merge(*key.m_pMemory);
@@ -424,8 +366,6 @@ inline Node Node::operator[](const Node& key) {
}
inline bool Node::remove(const Node& key) {
if (!m_isValid || !key.m_isValid)
throw InvalidNode();
EnsureNodeExists();
key.EnsureNodeExists();
return m_pNode->remove(*key.m_pNode, m_pMemory);
@@ -434,15 +374,12 @@ inline bool Node::remove(const Node& key) {
// map
template <typename Key, typename Value>
inline void Node::force_insert(const Key& key, const Value& value) {
if (!m_isValid)
throw InvalidNode();
EnsureNodeExists();
m_pNode->force_insert(detail::to_value(key), detail::to_value(value),
m_pMemory);
m_pNode->force_insert(key, value, m_pMemory);
}
// free functions
inline bool operator==(const Node& lhs, const Node& rhs) { return lhs.is(rhs); }
}
} // namespace YAML
#endif // NODE_IMPL_H_62B23520_7C8E_11DE_8A39_0800200C9A66

View File

@@ -15,10 +15,13 @@
#include <utility>
#include <vector>
// Assert in place so gcc + libc++ combination properly builds
static_assert(std::is_constructible<YAML::Node, const YAML::Node&>::value, "Node must be copy constructable");
namespace YAML {
namespace detail {
struct iterator_value : public Node, std::pair<Node, Node> {
iterator_value() {}
iterator_value() = default;
explicit iterator_value(const Node& rhs)
: Node(rhs),
std::pair<Node, Node>(Node(Node::ZombieNode), Node(Node::ZombieNode)) {}

View File

@@ -8,11 +8,11 @@
#endif
#include <stdexcept>
#include <string>
#include "yaml-cpp/dll.h"
#include "yaml-cpp/emitterstyle.h"
#include "yaml-cpp/mark.h"
#include "yaml-cpp/node/detail/bool_type.h"
#include "yaml-cpp/node/detail/iterator_fwd.h"
#include "yaml-cpp/node/ptr.h"
#include "yaml-cpp/node/type.h"
@@ -38,8 +38,8 @@ class YAML_CPP_API Node {
template <typename T, typename S>
friend struct as_if;
typedef YAML::iterator iterator;
typedef YAML::const_iterator const_iterator;
using iterator = YAML::iterator;
using const_iterator = YAML::const_iterator;
Node();
explicit Node(NodeType::value type);
@@ -58,7 +58,7 @@ class YAML_CPP_API Node {
bool IsMap() const { return Type() == NodeType::Map; }
// bool conversions
YAML_CPP_OPERATOR_BOOL()
explicit operator bool() const { return IsDefined(); }
bool operator!() const { return !IsDefined(); }
// access
@@ -116,6 +116,7 @@ class YAML_CPP_API Node {
private:
enum Zombie { ZombieNode };
explicit Node(Zombie);
explicit Node(Zombie, const std::string&);
explicit Node(detail::node& node, detail::shared_memory_holder pMemory);
void EnsureNodeExists() const;
@@ -130,6 +131,8 @@ class YAML_CPP_API Node {
private:
bool m_isValid;
// String representation of invalid key, if the node is invalid.
std::string m_invalidKey;
mutable detail::shared_memory_holder m_pMemory;
mutable detail::node* m_pNode;
};

View File

@@ -7,7 +7,6 @@
#pragma once
#endif
#include "yaml-cpp/dll.h"
#include <memory>
namespace YAML {
@@ -18,11 +17,11 @@ class node_data;
class memory;
class memory_holder;
typedef std::shared_ptr<node> shared_node;
typedef std::shared_ptr<node_ref> shared_node_ref;
typedef std::shared_ptr<node_data> shared_node_data;
typedef std::shared_ptr<memory_holder> shared_memory_holder;
typedef std::shared_ptr<memory> shared_memory;
using shared_node = std::shared_ptr<node>;
using shared_node_ref = std::shared_ptr<node_ref>;
using shared_node_data = std::shared_ptr<node_data>;
using shared_memory_holder = std::shared_ptr<memory_holder>;
using shared_memory = std::shared_ptr<memory>;
}
}

View File

@@ -0,0 +1,18 @@
#ifndef NOEXCEPT_H_768872DA_476C_11EA_88B8_90B11C0C0FF8
#define NOEXCEPT_H_768872DA_476C_11EA_88B8_90B11C0C0FF8
#if defined(_MSC_VER) || \
(defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || \
(__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4
#pragma once
#endif
// This is here for compatibility with older versions of Visual Studio
// which don't support noexcept.
#if defined(_MSC_VER) && _MSC_VER < 1900
#define YAML_CPP_NOEXCEPT _NOEXCEPT
#else
#define YAML_CPP_NOEXCEPT noexcept
#endif
#endif

View File

@@ -17,6 +17,10 @@ class YAML_CPP_API ostream_wrapper {
public:
ostream_wrapper();
explicit ostream_wrapper(std::ostream& stream);
ostream_wrapper(const ostream_wrapper&) = delete;
ostream_wrapper(ostream_wrapper&&) = delete;
ostream_wrapper& operator=(const ostream_wrapper&) = delete;
ostream_wrapper& operator=(ostream_wrapper&&) = delete;
~ostream_wrapper();
void write(const std::string& str);
@@ -26,7 +30,7 @@ class YAML_CPP_API ostream_wrapper {
const char* str() const {
if (m_pStream) {
return 0;
return nullptr;
} else {
m_buffer[m_pos] = '\0';
return &m_buffer[0];
@@ -52,7 +56,7 @@ class YAML_CPP_API ostream_wrapper {
template <std::size_t N>
inline ostream_wrapper& operator<<(ostream_wrapper& stream,
const char(&str)[N]) {
const char (&str)[N]) {
stream.write(str, N - 1);
return stream;
}
@@ -67,6 +71,6 @@ inline ostream_wrapper& operator<<(ostream_wrapper& stream, char ch) {
stream.write(&ch, 1);
return stream;
}
}
} // namespace YAML
#endif // OSTREAM_WRAPPER_H_62B23520_7C8E_11DE_8A39_0800200C9A66

View File

@@ -11,7 +11,6 @@
#include <memory>
#include "yaml-cpp/dll.h"
#include "yaml-cpp/noncopyable.h"
namespace YAML {
class EventHandler;
@@ -24,11 +23,16 @@ struct Token;
* A parser turns a stream of bytes into one stream of "events" per YAML
* document in the input stream.
*/
class YAML_CPP_API Parser : private noncopyable {
class YAML_CPP_API Parser {
public:
/** Constructs an empty parser (with no input. */
Parser();
Parser(const Parser&) = delete;
Parser(Parser&&) = delete;
Parser& operator=(const Parser&) = delete;
Parser& operator=(Parser&&) = delete;
/**
* Constructs a parser from the given input stream. The input stream must
* live as long as the parser.
@@ -81,6 +85,6 @@ class YAML_CPP_API Parser : private noncopyable {
std::unique_ptr<Scanner> m_pScanner;
std::unique_ptr<Directives> m_pDirectives;
};
}
} // namespace YAML
#endif // PARSER_H_62B23520_7C8E_11DE_8A39_0800200C9A66

View File

@@ -16,8 +16,8 @@ namespace YAML {
template <typename Seq>
inline Emitter& EmitSeq(Emitter& emitter, const Seq& seq) {
emitter << BeginSeq;
for (typename Seq::const_iterator it = seq.begin(); it != seq.end(); ++it)
emitter << *it;
for (const auto& v : seq)
emitter << v;
emitter << EndSeq;
return emitter;
}
@@ -39,10 +39,9 @@ inline Emitter& operator<<(Emitter& emitter, const std::set<T>& v) {
template <typename K, typename V>
inline Emitter& operator<<(Emitter& emitter, const std::map<K, V>& m) {
typedef typename std::map<K, V> map;
emitter << BeginMap;
for (typename map::const_iterator it = m.begin(); it != m.end(); ++it)
emitter << Key << it->first << Value << it->second;
for (const auto& v : m)
emitter << Key << v.first << Value << v.second;
emitter << EndMap;
return emitter;
}

View File

@@ -7,6 +7,11 @@
#pragma once
#endif
#include <type_traits>
#include <utility>
#include <string>
#include <sstream>
namespace YAML {
template <typename>
struct is_numeric {
@@ -79,7 +84,7 @@ struct is_numeric<long double> {
template <bool, class T = void>
struct enable_if_c {
typedef T type;
using type = T;
};
template <class T>
@@ -90,7 +95,7 @@ struct enable_if : public enable_if_c<Cond::value, T> {};
template <bool, class T = void>
struct disable_if_c {
typedef T type;
using type = T;
};
template <class T>
@@ -100,4 +105,31 @@ template <class Cond, class T = void>
struct disable_if : public disable_if_c<Cond::value, T> {};
}
template <typename S, typename T>
struct is_streamable {
template <typename StreamT, typename ValueT>
static auto test(int)
-> decltype(std::declval<StreamT&>() << std::declval<ValueT>(), std::true_type());
template <typename, typename>
static auto test(...) -> std::false_type;
static const bool value = decltype(test<S, T>(0))::value;
};
template<typename Key, bool Streamable>
struct streamable_to_string {
static std::string impl(const Key& key) {
std::stringstream ss;
ss << key;
return ss.str();
}
};
template<typename Key>
struct streamable_to_string<Key, false> {
static std::string impl(const Key&) {
return "";
}
};
#endif // TRAITS_H_62B23520_7C8E_11DE_8A39_0800200C9A66

View File

@@ -1,5 +1,7 @@
#include "yaml-cpp/binary.h"
#include <cctype>
namespace YAML {
static const char encoding[] =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
@@ -64,7 +66,7 @@ static const unsigned char decoding[] = {
};
std::vector<unsigned char> DecodeBase64(const std::string &input) {
typedef std::vector<unsigned char> ret_type;
using ret_type = std::vector<unsigned char>;
if (input.empty())
return ret_type();
@@ -72,22 +74,27 @@ std::vector<unsigned char> DecodeBase64(const std::string &input) {
unsigned char *out = &ret[0];
unsigned value = 0;
for (std::size_t i = 0; i < input.size(); i++) {
unsigned char d = decoding[static_cast<unsigned>(input[i])];
for (std::size_t i = 0, cnt = 0; i < input.size(); i++) {
if (std::isspace(static_cast<unsigned char>(input[i]))) {
// skip newlines
continue;
}
unsigned char d = decoding[static_cast<unsigned char>(input[i])];
if (d == 255)
return ret_type();
value = (value << 6) | d;
if (i % 4 == 3) {
if (cnt % 4 == 3) {
*out++ = value >> 16;
if (i > 0 && input[i - 1] != '=')
*out++ = value >> 8;
if (input[i] != '=')
*out++ = value;
}
++cnt;
}
ret.resize(out - &ret[0]);
return ret;
}
}
} // namespace YAML

View File

@@ -7,8 +7,8 @@
#pragma once
#endif
#include <stack>
#include <cassert>
#include <stack>
namespace YAML {
struct CollectionType {
@@ -17,6 +17,7 @@ struct CollectionType {
class CollectionStack {
public:
CollectionStack() : collectionStack{} {}
CollectionType::value GetCurCollectionType() const {
if (collectionStack.empty())
return CollectionType::NoCollection;
@@ -28,12 +29,13 @@ class CollectionStack {
}
void PopCollectionType(CollectionType::value type) {
assert(type == GetCurCollectionType());
(void)type;
collectionStack.pop();
}
private:
std::stack<CollectionType::value> collectionStack;
};
}
} // namespace YAML
#endif // COLLECTIONSTACK_H_62B23520_7C8E_11DE_8A39_0800200C9A66

View File

@@ -10,8 +10,7 @@ void* BuildGraphOfNextDocument(Parser& parser,
GraphBuilderAdapter eventHandler(graphBuilder);
if (parser.HandleNextDocument(eventHandler)) {
return eventHandler.RootNode();
} else {
return NULL;
}
return nullptr;
}
}
} // namespace YAML

View File

@@ -49,7 +49,7 @@ void GraphBuilderAdapter::OnMapStart(const Mark &mark, const std::string &tag,
EmitterStyle::value /* style */) {
void *pNode = m_builder.NewMap(mark, tag, GetCurrentParent());
m_containers.push(ContainerFrame(pNode, m_pKeyNode));
m_pKeyNode = NULL;
m_pKeyNode = nullptr;
RegisterAnchor(anchor, pNode);
}
@@ -62,7 +62,7 @@ void GraphBuilderAdapter::OnMapEnd() {
void *GraphBuilderAdapter::GetCurrentParent() const {
if (m_containers.empty()) {
return NULL;
return nullptr;
}
return m_containers.top().pContainer;
}
@@ -83,7 +83,7 @@ void GraphBuilderAdapter::DispositionNode(void *pNode) {
if (m_containers.top().isMap()) {
if (m_pKeyNode) {
m_builder.AssignInMap(pContainer, m_pKeyNode, pNode);
m_pKeyNode = NULL;
m_pKeyNode = nullptr;
} else {
m_pKeyNode = pNode;
}
@@ -91,4 +91,4 @@ void GraphBuilderAdapter::DispositionNode(void *pNode) {
m_builder.AppendToSequence(pContainer, pNode);
}
}
}
} // namespace YAML

View File

@@ -13,7 +13,6 @@
#include "yaml-cpp/anchor.h"
#include "yaml-cpp/contrib/anchordict.h"
#include "yaml-cpp/contrib/graphbuilder.h"
#include "yaml-cpp/emitterstyle.h"
#include "yaml-cpp/eventhandler.h"
@@ -26,7 +25,15 @@ namespace YAML {
class GraphBuilderAdapter : public EventHandler {
public:
GraphBuilderAdapter(GraphBuilderInterface& builder)
: m_builder(builder), m_pRootNode(NULL), m_pKeyNode(NULL) {}
: m_builder(builder),
m_containers{},
m_anchors{},
m_pRootNode(nullptr),
m_pKeyNode(nullptr) {}
GraphBuilderAdapter(const GraphBuilderAdapter&) = delete;
GraphBuilderAdapter(GraphBuilderAdapter&&) = delete;
GraphBuilderAdapter& operator=(const GraphBuilderAdapter&) = delete;
GraphBuilderAdapter& operator=(GraphBuilderAdapter&&) = delete;
virtual void OnDocumentStart(const Mark& mark) { (void)mark; }
virtual void OnDocumentEnd() {}
@@ -50,8 +57,8 @@ class GraphBuilderAdapter : public EventHandler {
struct ContainerFrame {
ContainerFrame(void* pSequence)
: pContainer(pSequence), pPrevKeyNode(&sequenceMarker) {}
ContainerFrame(void* pMap, void* pPrevKeyNode_)
: pContainer(pMap), pPrevKeyNode(pPrevKeyNode_) {}
ContainerFrame(void* pMap, void* pPreviousKeyNode)
: pContainer(pMap), pPrevKeyNode(pPreviousKeyNode) {}
void* pContainer;
void* pPrevKeyNode;
@@ -74,6 +81,6 @@ class GraphBuilderAdapter : public EventHandler {
void RegisterAnchor(anchor_t anchor, void* pNode);
void DispositionNode(void* pNode);
};
}
} // namespace YAML
#endif // GRAPHBUILDERADAPTER_H_62B23520_7C8E_11DE_8A39_0800200C9A66

View File

@@ -0,0 +1,32 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- MSVC Debugger visualization hints for YAML::Node and YAML::detail::node -->
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
<Type Name="YAML::Node">
<DisplayString Condition="!m_isValid">{{invalid}}</DisplayString>
<DisplayString Condition="!m_pNode">{{pNode==nullptr}}</DisplayString>
<DisplayString>{{ {*m_pNode} }}</DisplayString>
<Expand>
<Item Condition="m_pNode->m_pRef._Ptr->m_pData._Ptr->m_type==YAML::NodeType::Scalar" Name="scalar">m_pNode->m_pRef._Ptr->m_pData._Ptr->m_scalar</Item>
<Item Condition="m_pNode->m_pRef._Ptr->m_pData._Ptr->m_type==YAML::NodeType::Sequence" Name="sequence">m_pNode->m_pRef._Ptr->m_pData._Ptr->m_sequence</Item>
<Item Condition="m_pNode->m_pRef._Ptr->m_pData._Ptr->m_type==YAML::NodeType::Map" Name="map">m_pNode->m_pRef._Ptr->m_pData._Ptr->m_map</Item>
<Item Name="[details]" >m_pNode->m_pRef._Ptr->m_pData._Ptr</Item>
</Expand>
</Type>
<Type Name="YAML::detail::node">
<DisplayString Condition="!m_pRef._Ptr">{{node:pRef==nullptr}}</DisplayString>
<DisplayString Condition="!m_pRef._Ptr->m_pData._Ptr">{{node:pRef->pData==nullptr}}</DisplayString>
<DisplayString Condition="!m_pRef._Ptr->m_pData._Ptr->m_isDefined">{{undefined}}</DisplayString>
<DisplayString Condition="m_pRef._Ptr->m_pData._Ptr->m_type==YAML::NodeType::Scalar">{{{m_pRef._Ptr->m_pData._Ptr->m_scalar}}}</DisplayString>
<DisplayString Condition="m_pRef._Ptr->m_pData._Ptr->m_type==YAML::NodeType::Map">{{ Map {m_pRef._Ptr->m_pData._Ptr->m_map}}}</DisplayString>
<DisplayString Condition="m_pRef._Ptr->m_pData._Ptr->m_type==YAML::NodeType::Sequence">{{ Seq {m_pRef._Ptr->m_pData._Ptr->m_sequence}}}</DisplayString>
<DisplayString>{{{m_pRef._Ptr->m_pData._Ptr->m_type}}}</DisplayString>
<Expand>
<Item Condition="m_pRef._Ptr->m_pData._Ptr->m_type==YAML::NodeType::Scalar" Name="scalar">m_pRef._Ptr->m_pData._Ptr->m_scalar</Item>
<Item Condition="m_pRef._Ptr->m_pData._Ptr->m_type==YAML::NodeType::Sequence" Name="sequence">m_pRef._Ptr->m_pData._Ptr->m_sequence</Item>
<Item Condition="m_pRef._Ptr->m_pData._Ptr->m_type==YAML::NodeType::Map" Name="map">m_pRef._Ptr->m_pData._Ptr->m_map</Item>
<Item Name="[details]" >m_pRef._Ptr->m_pData._Ptr</Item>
</Expand>
</Type>
</AutoVisualizer>

View File

@@ -0,0 +1,9 @@
# MSVC debugger visualizer for YAML::Node
## How to use
Add yaml-cpp.natvis to your Visual C++ project like any other source file. It will be included in the debug information, and improve debugger display on YAML::Node and contained types.
## Compatibility and Troubleshooting
This has been tested for MSVC 2017. It is expected to be compatible with VS 2015 and VS 2019. If you have any problems, you can open an issue here: https://github.com/peterchen-cp/yaml-cpp-natvis

View File

@@ -16,11 +16,7 @@ std::string tolower(const std::string& str) {
template <typename T>
bool IsEntirely(const std::string& str, T func) {
for (std::size_t i = 0; i < str.size(); i++)
if (!func(str[i]))
return false;
return true;
return std::all_of(str.begin(), str.end(), [=](char ch) { return func(ch); });
}
// IsFlexibleCase
@@ -39,7 +35,7 @@ bool IsFlexibleCase(const std::string& str) {
std::string rest = str.substr(1);
return firstcaps && (IsEntirely(rest, IsLower) || IsEntirely(rest, IsUpper));
}
}
} // namespace
namespace YAML {
bool convert<bool>::decode(const Node& node, bool& rhs) {
@@ -52,19 +48,22 @@ bool convert<bool>::decode(const Node& node, bool& rhs) {
static const struct {
std::string truename, falsename;
} names[] = {
{"y", "n"}, {"yes", "no"}, {"true", "false"}, {"on", "off"},
{"y", "n"},
{"yes", "no"},
{"true", "false"},
{"on", "off"},
};
if (!IsFlexibleCase(node.Scalar()))
return false;
for (unsigned i = 0; i < sizeof(names) / sizeof(names[0]); i++) {
if (names[i].truename == tolower(node.Scalar())) {
for (const auto& name : names) {
if (name.truename == tolower(node.Scalar())) {
rhs = true;
return true;
}
if (names[i].falsename == tolower(node.Scalar())) {
if (name.falsename == tolower(node.Scalar())) {
rhs = false;
return true;
}
@@ -72,4 +71,4 @@ bool convert<bool>::decode(const Node& node, bool& rhs) {
return false;
}
}
} // namespace YAML

9
3rdparty/yaml-cpp/src/depthguard.cpp vendored Normal file
View File

@@ -0,0 +1,9 @@
#include "yaml-cpp/depthguard.h"
namespace YAML {
DeepRecursion::DeepRecursion(int depth, const Mark& mark_,
const std::string& msg_)
: ParserException(mark_, msg_), m_depth(depth) {}
} // namespace YAML

View File

@@ -1,16 +1,11 @@
#include "directives.h"
namespace YAML {
Directives::Directives() {
// version
version.isDefault = true;
version.major = 1;
version.minor = 2;
}
Directives::Directives() : version{true, 1, 2}, tags{} {}
const std::string Directives::TranslateTagHandle(
std::string Directives::TranslateTagHandle(
const std::string& handle) const {
std::map<std::string, std::string>::const_iterator it = tags.find(handle);
auto it = tags.find(handle);
if (it == tags.end()) {
if (handle == "!!")
return "tag:yaml.org,2002:";
@@ -19,4 +14,4 @@ const std::string Directives::TranslateTagHandle(
return it->second;
}
}
} // namespace YAML

View File

@@ -19,7 +19,7 @@ struct Version {
struct Directives {
Directives();
const std::string TranslateTagHandle(const std::string& handle) const;
std::string TranslateTagHandle(const std::string& handle) const;
Version version;
std::map<std::string, std::string> tags;

View File

@@ -1,7 +1,7 @@
#include "yaml-cpp/node/emit.h"
#include "nodeevents.h"
#include "yaml-cpp/emitfromevents.h"
#include "yaml-cpp/emitter.h"
#include "nodeevents.h"
namespace YAML {
Emitter& operator<<(Emitter& out, const Node& node) {

View File

@@ -16,10 +16,11 @@ std::string ToString(YAML::anchor_t anchor) {
stream << anchor;
return stream.str();
}
}
} // namespace
namespace YAML {
EmitFromEvents::EmitFromEvents(Emitter& emitter) : m_emitter(emitter) {}
EmitFromEvents::EmitFromEvents(Emitter& emitter)
: m_emitter(emitter), m_stateStack{} {}
void EmitFromEvents::OnDocumentStart(const Mark&) {}
@@ -58,6 +59,8 @@ void EmitFromEvents::OnSequenceStart(const Mark&, const std::string& tag,
default:
break;
}
// Restore the global settings to eliminate the override from node style
m_emitter.RestoreGlobalModifiedSettings();
m_emitter << BeginSeq;
m_stateStack.push(State::WaitingForSequenceEntry);
}
@@ -82,6 +85,8 @@ void EmitFromEvents::OnMapStart(const Mark&, const std::string& tag,
default:
break;
}
// Restore the global settings to eliminate the override from node style
m_emitter.RestoreGlobalModifiedSettings();
m_emitter << BeginMap;
m_stateStack.push(State::WaitingForKey);
}
@@ -116,4 +121,4 @@ void EmitFromEvents::EmitProps(const std::string& tag, anchor_t anchor) {
if (anchor)
m_emitter << Anchor(ToString(anchor));
}
}
} // namespace YAML

View File

@@ -11,12 +11,12 @@ namespace YAML {
class Binary;
struct _Null;
Emitter::Emitter() : m_pState(new EmitterState) {}
Emitter::Emitter() : m_pState(new EmitterState), m_stream{} {}
Emitter::Emitter(std::ostream& stream)
: m_pState(new EmitterState), m_stream(stream) {}
Emitter::~Emitter() {}
Emitter::~Emitter() = default;
const char* Emitter::c_str() const { return m_stream.str(); }
@@ -90,6 +90,10 @@ bool Emitter::SetDoublePrecision(std::size_t n) {
return m_pState->SetDoublePrecision(n, FmtScope::Global);
}
void Emitter::RestoreGlobalModifiedSettings() {
m_pState->RestoreGlobalModifiedSettings();
}
// SetLocalValue
// . Either start/end a group, or set a modifier locally
Emitter& Emitter::SetLocalValue(EMITTER_MANIP value) {
@@ -201,6 +205,7 @@ void Emitter::EmitBeginSeq() {
void Emitter::EmitEndSeq() {
if (!good())
return;
FlowType::value originalType = m_pState->CurGroupFlowType();
if (m_pState->CurGroupChildCount() == 0)
m_pState->ForceFlow();
@@ -209,8 +214,12 @@ void Emitter::EmitEndSeq() {
if (m_stream.comment())
m_stream << "\n";
m_stream << IndentTo(m_pState->CurIndent());
if (m_pState->CurGroupChildCount() == 0)
if (originalType == FlowType::Block) {
m_stream << "[";
} else {
if (m_pState->CurGroupChildCount() == 0 && !m_pState->HasBegunNode())
m_stream << "[";
}
m_stream << "]";
}
@@ -231,6 +240,7 @@ void Emitter::EmitBeginMap() {
void Emitter::EmitEndMap() {
if (!good())
return;
FlowType::value originalType = m_pState->CurGroupFlowType();
if (m_pState->CurGroupChildCount() == 0)
m_pState->ForceFlow();
@@ -239,8 +249,12 @@ void Emitter::EmitEndMap() {
if (m_stream.comment())
m_stream << "\n";
m_stream << IndentTo(m_pState->CurIndent());
if (m_pState->CurGroupChildCount() == 0)
if (originalType == FlowType::Block) {
m_stream << "{";
} else {
if (m_pState->CurGroupChildCount() == 0 && !m_pState->HasBegunNode())
m_stream << "{";
}
m_stream << "}";
}
@@ -289,10 +303,8 @@ void Emitter::PrepareTopNode(EmitterNodeType::value child) {
if (child == EmitterNodeType::NoType)
return;
if (m_pState->CurGroupChildCount() > 0 && m_stream.col() > 0) {
if (child != EmitterNodeType::NoType)
EmitBeginDoc();
}
if (m_pState->CurGroupChildCount() > 0 && m_stream.col() > 0)
EmitBeginDoc();
switch (child) {
case EmitterNodeType::NoType:
@@ -492,6 +504,9 @@ void Emitter::FlowMapPrepareSimpleKeyValue(EmitterNodeType::value child) {
if (m_stream.comment())
m_stream << "\n";
m_stream << IndentTo(lastIndent);
if (m_pState->HasAlias()) {
m_stream << " ";
}
m_stream << ":";
}
@@ -518,7 +533,8 @@ void Emitter::BlockMapPrepareNode(EmitterNodeType::value child) {
if (m_pState->GetMapKeyFormat() == LongKey)
m_pState->SetLongKey();
if (child == EmitterNodeType::BlockSeq ||
child == EmitterNodeType::BlockMap)
child == EmitterNodeType::BlockMap ||
child == EmitterNodeType::Property)
m_pState->SetLongKey();
if (m_pState->CurGroupLongKey())
@@ -562,6 +578,8 @@ void Emitter::BlockMapPrepareLongKey(EmitterNodeType::value child) {
break;
case EmitterNodeType::BlockSeq:
case EmitterNodeType::BlockMap:
if (m_pState->HasBegunContent())
m_stream << "\n";
break;
}
}
@@ -585,8 +603,12 @@ void Emitter::BlockMapPrepareLongKeyValue(EmitterNodeType::value child) {
case EmitterNodeType::Scalar:
case EmitterNodeType::FlowSeq:
case EmitterNodeType::FlowMap:
SpaceOrIndentTo(true, curIndent + 1);
break;
case EmitterNodeType::BlockSeq:
case EmitterNodeType::BlockMap:
if (m_pState->HasBegunContent())
m_stream << "\n";
SpaceOrIndentTo(true, curIndent + 1);
break;
}
@@ -625,6 +647,9 @@ void Emitter::BlockMapPrepareSimpleKeyValue(EmitterNodeType::value child) {
const std::size_t nextIndent = curIndent + m_pState->CurGroupIndent();
if (!m_pState->HasBegunNode()) {
if (m_pState->HasAlias()) {
m_stream << " ";
}
m_stream << ":";
}
@@ -678,25 +703,29 @@ void Emitter::StartedScalar() { m_pState->StartedScalar(); }
// *******************************************************************************************
// overloads of Write
StringEscaping::value GetStringEscapingStyle(const EMITTER_MANIP emitterManip) {
switch (emitterManip) {
case EscapeNonAscii:
return StringEscaping::NonAscii;
case EscapeAsJson:
return StringEscaping::JSON;
default:
return StringEscaping::None;
break;
}
}
Emitter& Emitter::Write(const std::string& str) {
if (!good())
return *this;
StringEscaping::value stringEscaping = StringEscaping::None;
switch (m_pState->GetOutputCharset()) {
case EscapeNonAscii:
stringEscaping = StringEscaping::NonAscii;
break;
case EscapeAsJson:
stringEscaping = StringEscaping::JSON;
break;
}
StringEscaping::value stringEscaping = GetStringEscapingStyle(m_pState->GetOutputCharset());
const StringFormat::value strFormat =
Utils::ComputeStringFormat(str, m_pState->GetStringFormat(),
m_pState->CurGroupFlowType(), stringEscaping == StringEscaping::NonAscii);
if (strFormat == StringFormat::Literal)
if (strFormat == StringFormat::Literal || str.size() > 1024)
m_pState->SetMapKeyFormat(YAML::LongKey, FmtScope::Local);
PrepareNode(EmitterNodeType::Scalar);
@@ -779,6 +808,21 @@ const char* Emitter::ComputeFullBoolName(bool b) const {
// these answers
}
const char* Emitter::ComputeNullName() const {
switch (m_pState->GetNullFormat()) {
case LowerNull:
return "null";
case UpperNull:
return "NULL";
case CamelNull:
return "Null";
case TildeNull:
// fallthrough
default:
return "~";
}
}
Emitter& Emitter::Write(bool b) {
if (!good())
return *this;
@@ -800,10 +844,10 @@ Emitter& Emitter::Write(char ch) {
if (!good())
return *this;
PrepareNode(EmitterNodeType::Scalar);
Utils::WriteChar(m_stream, ch, m_pState->GetOutputCharset() == EscapeAsJson);
Utils::WriteChar(m_stream, ch, GetStringEscapingStyle(m_pState->GetOutputCharset()));
StartedScalar();
return *this;
@@ -827,6 +871,8 @@ Emitter& Emitter::Write(const _Alias& alias) {
StartedScalar();
m_pState->SetAlias();
return *this;
}
@@ -904,10 +950,7 @@ Emitter& Emitter::Write(const _Null& /*null*/) {
PrepareNode(EmitterNodeType::Scalar);
if (m_pState->GetNullFormat() == NullAsNull)
m_stream << "null";
else
m_stream << "~";
m_stream << ComputeNullName();
StartedScalar();
@@ -926,4 +969,4 @@ Emitter& Emitter::Write(const Binary& binary) {
return *this;
}
}
} // namespace YAML

View File

@@ -6,30 +6,35 @@
namespace YAML {
EmitterState::EmitterState()
: m_isGood(true),
m_lastError{},
// default global manipulators
m_charset(EmitNonAscii),
m_strFmt(Auto),
m_boolFmt(TrueFalseBool),
m_boolLengthFmt(LongBool),
m_boolCaseFmt(LowerCase),
m_nullFmt(TildeNull),
m_intFmt(Dec),
m_indent(2),
m_preCommentIndent(2),
m_postCommentIndent(1),
m_seqFmt(Block),
m_mapFmt(Block),
m_mapKeyFmt(Auto),
m_floatPrecision(std::numeric_limits<float>::max_digits10),
m_doublePrecision(std::numeric_limits<double>::max_digits10),
//
m_modifiedSettings{},
m_globalModifiedSettings{},
m_groups{},
m_curIndent(0),
m_hasAnchor(false),
m_hasAlias(false),
m_hasTag(false),
m_hasNonContent(false),
m_docCount(0) {
// set default global manipulators
m_charset.set(EmitNonAscii);
m_strFmt.set(Auto);
m_boolFmt.set(TrueFalseBool);
m_nullFmt.set(NullAsTilde);
m_boolLengthFmt.set(LongBool);
m_boolCaseFmt.set(LowerCase);
m_intFmt.set(Dec);
m_indent.set(2);
m_preCommentIndent.set(2);
m_postCommentIndent.set(1);
m_seqFmt.set(Block);
m_mapFmt.set(Block);
m_mapKeyFmt.set(Auto);
m_floatPrecision.set(std::numeric_limits<float>::digits10 + 1);
m_doublePrecision.set(std::numeric_limits<double>::digits10 + 1);
}
m_docCount(0) {}
EmitterState::~EmitterState() {}
EmitterState::~EmitterState() = default;
// SetLocalValue
// . We blindly tries to set all possible formatters to this value
@@ -49,6 +54,8 @@ void EmitterState::SetLocalValue(EMITTER_MANIP value) {
void EmitterState::SetAnchor() { m_hasAnchor = true; }
void EmitterState::SetAlias() { m_hasAlias = true; }
void EmitterState::SetTag() { m_hasTag = true; }
void EmitterState::SetNonContent() { m_hasNonContent = true; }
@@ -83,6 +90,7 @@ void EmitterState::StartedNode() {
}
m_hasAnchor = false;
m_hasAlias = false;
m_hasTag = false;
m_hasNonContent = false;
}
@@ -92,15 +100,13 @@ EmitterNodeType::value EmitterState::NextGroupType(
if (type == GroupType::Seq) {
if (GetFlowType(type) == Block)
return EmitterNodeType::BlockSeq;
else
return EmitterNodeType::FlowSeq;
} else {
if (GetFlowType(type) == Block)
return EmitterNodeType::BlockMap;
else
return EmitterNodeType::FlowMap;
return EmitterNodeType::FlowSeq;
}
if (GetFlowType(type) == Block)
return EmitterNodeType::BlockMap;
return EmitterNodeType::FlowMap;
// can't happen
assert(false);
return EmitterNodeType::NoType;
@@ -154,9 +160,15 @@ void EmitterState::EndedGroup(GroupType::value type) {
if (m_groups.empty()) {
if (type == GroupType::Seq) {
return SetError(ErrorMsg::UNEXPECTED_END_SEQ);
} else {
return SetError(ErrorMsg::UNEXPECTED_END_MAP);
}
return SetError(ErrorMsg::UNEXPECTED_END_MAP);
}
if (m_hasTag) {
SetError(ErrorMsg::INVALID_TAG);
}
if (m_hasAnchor) {
SetError(ErrorMsg::INVALID_ANCHOR);
}
// get rid of the current group
@@ -178,6 +190,9 @@ void EmitterState::EndedGroup(GroupType::value type) {
m_globalModifiedSettings.restore();
ClearModifiedSettings();
m_hasAnchor = false;
m_hasTag = false;
m_hasNonContent = false;
}
EmitterNodeType::value EmitterState::CurGroupNodeType() const {
@@ -218,6 +233,10 @@ std::size_t EmitterState::LastIndent() const {
void EmitterState::ClearModifiedSettings() { m_modifiedSettings.clear(); }
void EmitterState::RestoreGlobalModifiedSettings() {
m_globalModifiedSettings.restore();
}
bool EmitterState::SetOutputCharset(EMITTER_MANIP value,
FmtScope::value scope) {
switch (value) {
@@ -283,12 +302,14 @@ bool EmitterState::SetBoolCaseFormat(EMITTER_MANIP value,
bool EmitterState::SetNullFormat(EMITTER_MANIP value, FmtScope::value scope) {
switch (value) {
case NullAsTilde:
case NullAsNull:
_Set(m_nullFmt, value, scope);
return true;
default:
return false;
case LowerNull:
case UpperNull:
case CamelNull:
case TildeNull:
_Set(m_nullFmt, value, scope);
return true;
default:
return false;
}
}
@@ -363,7 +384,7 @@ bool EmitterState::SetMapKeyFormat(EMITTER_MANIP value, FmtScope::value scope) {
}
bool EmitterState::SetFloatPrecision(std::size_t value, FmtScope::value scope) {
if (value > std::numeric_limits<float>::digits10 + 1)
if (value > std::numeric_limits<float>::max_digits10)
return false;
_Set(m_floatPrecision, value, scope);
return true;
@@ -371,9 +392,9 @@ bool EmitterState::SetFloatPrecision(std::size_t value, FmtScope::value scope) {
bool EmitterState::SetDoublePrecision(std::size_t value,
FmtScope::value scope) {
if (value > std::numeric_limits<double>::digits10 + 1)
if (value > std::numeric_limits<double>::max_digits10)
return false;
_Set(m_doublePrecision, value, scope);
return true;
}
}
} // namespace YAML

View File

@@ -43,6 +43,7 @@ class EmitterState {
// node handling
void SetAnchor();
void SetAlias();
void SetTag();
void SetNonContent();
void SetLongKey();
@@ -65,6 +66,7 @@ class EmitterState {
std::size_t LastIndent() const;
std::size_t CurIndent() const { return m_curIndent; }
bool HasAnchor() const { return m_hasAnchor; }
bool HasAlias() const { return m_hasAlias; }
bool HasTag() const { return m_hasTag; }
bool HasBegunNode() const {
return m_hasAnchor || m_hasTag || m_hasNonContent;
@@ -72,6 +74,7 @@ class EmitterState {
bool HasBegunContent() const { return m_hasAnchor || m_hasTag; }
void ClearModifiedSettings();
void RestoreGlobalModifiedSettings();
// formatters
void SetLocalValue(EMITTER_MANIP value);
@@ -132,9 +135,9 @@ class EmitterState {
Setting<EMITTER_MANIP> m_charset;
Setting<EMITTER_MANIP> m_strFmt;
Setting<EMITTER_MANIP> m_boolFmt;
Setting<EMITTER_MANIP> m_nullFmt;
Setting<EMITTER_MANIP> m_boolLengthFmt;
Setting<EMITTER_MANIP> m_boolCaseFmt;
Setting<EMITTER_MANIP> m_nullFmt;
Setting<EMITTER_MANIP> m_intFmt;
Setting<std::size_t> m_indent;
Setting<std::size_t> m_preCommentIndent, m_postCommentIndent;
@@ -149,7 +152,12 @@ class EmitterState {
struct Group {
explicit Group(GroupType::value type_)
: type(type_), indent(0), childCount(0), longKey(false) {}
: type(type_),
flowType{},
indent(0),
childCount(0),
longKey(false),
modifiedSettings{} {}
GroupType::value type;
FlowType::value flowType;
@@ -181,6 +189,7 @@ class EmitterState {
std::vector<std::unique_ptr<Group>> m_groups;
std::size_t m_curIndent;
bool m_hasAnchor;
bool m_hasAlias;
bool m_hasTag;
bool m_hasNonContent;
std::size_t m_docCount;
@@ -202,6 +211,6 @@ void EmitterState::_Set(Setting<T>& fmt, T value, FmtScope::value scope) {
assert(false);
}
}
}
} // namespace YAML
#endif // EMITTERSTATE_H_62B23520_7C8E_11DE_8A39_0800200C9A66

View File

@@ -1,3 +1,4 @@
#include <algorithm>
#include <iomanip>
#include <sstream>
@@ -8,8 +9,8 @@
#include "regeximpl.h"
#include "stringsource.h"
#include "yaml-cpp/binary.h" // IWYU pragma: keep
#include "yaml-cpp/ostream_wrapper.h"
#include "yaml-cpp/null.h"
#include "yaml-cpp/ostream_wrapper.h"
namespace YAML {
namespace Utils {
@@ -134,12 +135,12 @@ void WriteCodePoint(ostream_wrapper& out, int codePoint) {
if (codePoint < 0 || codePoint > 0x10FFFF) {
codePoint = REPLACEMENT_CHARACTER;
}
if (codePoint < 0x7F) {
if (codePoint <= 0x7F) {
out << static_cast<char>(codePoint);
} else if (codePoint < 0x7FF) {
} else if (codePoint <= 0x7FF) {
out << static_cast<char>(0xC0 | (codePoint >> 6))
<< static_cast<char>(0x80 | (codePoint & 0x3F));
} else if (codePoint < 0xFFFF) {
} else if (codePoint <= 0xFFFF) {
out << static_cast<char>(0xE0 | (codePoint >> 12))
<< static_cast<char>(0x80 | ((codePoint >> 6) & 0x3F))
<< static_cast<char>(0x80 | (codePoint & 0x3F));
@@ -173,13 +174,13 @@ bool IsValidPlainScalar(const std::string& str, FlowType::value flowType,
// then check until something is disallowed
static const RegEx& disallowed_flow =
Exp::EndScalarInFlow() || (Exp::BlankOrBreak() + Exp::Comment()) ||
Exp::NotPrintable() || Exp::Utf8_ByteOrderMark() || Exp::Break() ||
Exp::Tab();
Exp::EndScalarInFlow() | (Exp::BlankOrBreak() + Exp::Comment()) |
Exp::NotPrintable() | Exp::Utf8_ByteOrderMark() | Exp::Break() |
Exp::Tab() | Exp::Ampersand();
static const RegEx& disallowed_block =
Exp::EndScalar() || (Exp::BlankOrBreak() + Exp::Comment()) ||
Exp::NotPrintable() || Exp::Utf8_ByteOrderMark() || Exp::Break() ||
Exp::Tab();
Exp::EndScalar() | (Exp::BlankOrBreak() + Exp::Comment()) |
Exp::NotPrintable() | Exp::Utf8_ByteOrderMark() | Exp::Break() |
Exp::Tab() | Exp::Ampersand();
const RegEx& disallowed =
flowType == FlowType::Flow ? disallowed_flow : disallowed_block;
@@ -199,15 +200,10 @@ bool IsValidPlainScalar(const std::string& str, FlowType::value flowType,
bool IsValidSingleQuotedScalar(const std::string& str, bool escapeNonAscii) {
// TODO: check for non-printable characters?
for (std::size_t i = 0; i < str.size(); i++) {
if (escapeNonAscii && (0x80 <= static_cast<unsigned char>(str[i]))) {
return false;
}
if (str[i] == '\n') {
return false;
}
}
return true;
return std::none_of(str.begin(), str.end(), [=](char ch) {
return (escapeNonAscii && (0x80 <= static_cast<unsigned char>(ch))) ||
(ch == '\n');
});
}
bool IsValidLiteralScalar(const std::string& str, FlowType::value flowType,
@@ -217,12 +213,9 @@ bool IsValidLiteralScalar(const std::string& str, FlowType::value flowType,
}
// TODO: check for non-printable characters?
for (std::size_t i = 0; i < str.size(); i++) {
if (escapeNonAscii && (0x80 <= static_cast<unsigned char>(str[i]))) {
return false;
}
}
return true;
return std::none_of(str.begin(), str.end(), [=](char ch) {
return (escapeNonAscii && (0x80 <= static_cast<unsigned char>(ch)));
});
}
std::pair<uint16_t, uint16_t> EncodeUTF16SurrogatePair(int codePoint) {
@@ -234,24 +227,24 @@ std::pair<uint16_t, uint16_t> EncodeUTF16SurrogatePair(int codePoint) {
};
}
void WriteDoubleQuoteEscapeSequence(ostream_wrapper& out, int codePoint, bool escapeAsJson) {
void WriteDoubleQuoteEscapeSequence(ostream_wrapper& out, int codePoint, StringEscaping::value stringEscapingStyle) {
static const char hexDigits[] = "0123456789abcdef";
out << "\\";
int digits = 8;
if (codePoint < 0xFF && !escapeAsJson) {
if (codePoint < 0xFF && stringEscapingStyle != StringEscaping::JSON) {
out << "x";
digits = 2;
} else if (codePoint < 0xFFFF) {
out << "u";
digits = 4;
} else if (!escapeAsJson) {
} else if (stringEscapingStyle != StringEscaping::JSON) {
out << "U";
digits = 8;
} else {
auto surrogatePair = EncodeUTF16SurrogatePair(codePoint);
WriteDoubleQuoteEscapeSequence(out, surrogatePair.first, true);
WriteDoubleQuoteEscapeSequence(out, surrogatePair.second, true);
WriteDoubleQuoteEscapeSequence(out, surrogatePair.first, stringEscapingStyle);
WriteDoubleQuoteEscapeSequence(out, surrogatePair.second, stringEscapingStyle);
return;
}
@@ -272,7 +265,7 @@ bool WriteAliasName(ostream_wrapper& out, const std::string& str) {
}
return true;
}
}
} // namespace
StringFormat::value ComputeStringFormat(const std::string& str,
EMITTER_MANIP strFormat,
@@ -355,12 +348,12 @@ bool WriteDoubleQuotedString(ostream_wrapper& out, const std::string& str,
if (codePoint < 0x20 ||
(codePoint >= 0x80 &&
codePoint <= 0xA0)) { // Control characters and non-breaking space
WriteDoubleQuoteEscapeSequence(out, codePoint, stringEscaping == StringEscaping::JSON);
WriteDoubleQuoteEscapeSequence(out, codePoint, stringEscaping);
} else if (codePoint == 0xFEFF) { // Byte order marks (ZWNS) should be
// escaped (YAML 1.2, sec. 5.2)
WriteDoubleQuoteEscapeSequence(out, codePoint, stringEscaping == StringEscaping::JSON);
WriteDoubleQuoteEscapeSequence(out, codePoint, stringEscaping);
} else if (stringEscaping == StringEscaping::NonAscii && codePoint > 0x7E) {
WriteDoubleQuoteEscapeSequence(out, codePoint, false);
WriteDoubleQuoteEscapeSequence(out, codePoint, stringEscaping);
} else {
WriteCodePoint(out, codePoint);
}
@@ -373,41 +366,41 @@ bool WriteDoubleQuotedString(ostream_wrapper& out, const std::string& str,
bool WriteLiteralString(ostream_wrapper& out, const std::string& str,
std::size_t indent) {
out << "|\n";
out << IndentTo(indent);
int codePoint;
for (std::string::const_iterator i = str.begin();
GetNextCodePointAndAdvance(codePoint, i, str.end());) {
if (codePoint == '\n') {
out << "\n" << IndentTo(indent);
out << "\n";
} else {
out<< IndentTo(indent);
WriteCodePoint(out, codePoint);
}
}
return true;
}
bool WriteChar(ostream_wrapper& out, char ch, bool escapeAsJson) {
bool WriteChar(ostream_wrapper& out, char ch, StringEscaping::value stringEscapingStyle) {
if (('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z')) {
out << ch;
} else if (ch == '\"') {
out << "\"\\\"\"";
out << R"("\"")";
} else if (ch == '\t') {
out << "\"\\t\"";
out << R"("\t")";
} else if (ch == '\n') {
out << "\"\\n\"";
out << R"("\n")";
} else if (ch == '\b') {
out << "\"\\b\"";
out << R"("\b")";
} else if (ch == '\r') {
out << "\"\\r\"";
out << R"("\r")";
} else if (ch == '\f') {
out << "\"\\f\"";
out << R"("\f")";
} else if (ch == '\\') {
out << "\"\\\\\"";
} else if ((0x20 <= ch && ch <= 0x7e) || ch == ' ') {
out << R"("\\")";
} else if (0x20 <= ch && ch <= 0x7e) {
out << "\"" << ch << "\"";
} else {
out << "\"";
WriteDoubleQuoteEscapeSequence(out, ch, escapeAsJson);
WriteDoubleQuoteEscapeSequence(out, ch, stringEscapingStyle);
out << "\"";
}
return true;
@@ -422,8 +415,8 @@ bool WriteComment(ostream_wrapper& out, const std::string& str,
for (std::string::const_iterator i = str.begin();
GetNextCodePointAndAdvance(codePoint, i, str.end());) {
if (codePoint == '\n') {
out << "\n" << IndentTo(curIndent) << "#"
<< Indentation(postCommentIndent);
out << "\n"
<< IndentTo(curIndent) << "#" << Indentation(postCommentIndent);
out.set_comment();
} else {
WriteCodePoint(out, codePoint);
@@ -500,5 +493,5 @@ bool WriteBinary(ostream_wrapper& out, const Binary& binary) {
StringEscaping::None);
return true;
}
}
}
} // namespace Utils
} // namespace YAML

View File

@@ -39,7 +39,8 @@ bool WriteDoubleQuotedString(ostream_wrapper& out, const std::string& str,
StringEscaping::value stringEscaping);
bool WriteLiteralString(ostream_wrapper& out, const std::string& str,
std::size_t indent);
bool WriteChar(ostream_wrapper& out, char ch, bool escapeAsJson);
bool WriteChar(ostream_wrapper& out, char ch,
StringEscaping::value stringEscapingStyle);
bool WriteComment(ostream_wrapper& out, const std::string& str,
std::size_t postCommentIndent);
bool WriteAlias(ostream_wrapper& out, const std::string& str);

View File

@@ -1,19 +1,20 @@
#include "yaml-cpp/exceptions.h"
#include "yaml-cpp/noexcept.h"
namespace YAML {
// These destructors are defined out-of-line so the vtable is only emitted once.
Exception::~Exception() NOEXCEPT {}
ParserException::~ParserException() NOEXCEPT {}
RepresentationException::~RepresentationException() NOEXCEPT {}
InvalidScalar::~InvalidScalar() NOEXCEPT {}
KeyNotFound::~KeyNotFound() NOEXCEPT {}
InvalidNode::~InvalidNode() NOEXCEPT {}
BadConversion::~BadConversion() NOEXCEPT {}
BadDereference::~BadDereference() NOEXCEPT {}
BadSubscript::~BadSubscript() NOEXCEPT {}
BadPushback::~BadPushback() NOEXCEPT {}
BadInsert::~BadInsert() NOEXCEPT {}
EmitterException::~EmitterException() NOEXCEPT {}
BadFile::~BadFile() NOEXCEPT {}
}
Exception::~Exception() YAML_CPP_NOEXCEPT = default;
ParserException::~ParserException() YAML_CPP_NOEXCEPT = default;
RepresentationException::~RepresentationException() YAML_CPP_NOEXCEPT = default;
InvalidScalar::~InvalidScalar() YAML_CPP_NOEXCEPT = default;
KeyNotFound::~KeyNotFound() YAML_CPP_NOEXCEPT = default;
InvalidNode::~InvalidNode() YAML_CPP_NOEXCEPT = default;
BadConversion::~BadConversion() YAML_CPP_NOEXCEPT = default;
BadDereference::~BadDereference() YAML_CPP_NOEXCEPT = default;
BadSubscript::~BadSubscript() YAML_CPP_NOEXCEPT = default;
BadPushback::~BadPushback() YAML_CPP_NOEXCEPT = default;
BadInsert::~BadInsert() YAML_CPP_NOEXCEPT = default;
EmitterException::~EmitterException() YAML_CPP_NOEXCEPT = default;
BadFile::~BadFile() YAML_CPP_NOEXCEPT = default;
} // namespace YAML

View File

@@ -12,8 +12,7 @@ namespace YAML {
namespace Exp {
unsigned ParseHex(const std::string& str, const Mark& mark) {
unsigned value = 0;
for (std::size_t i = 0; i < str.size(); i++) {
char ch = str[i];
for (char ch : str) {
int digit = 0;
if ('a' <= ch && ch <= 'f')
digit = ch - 'a' + 10;
@@ -55,14 +54,16 @@ std::string Escape(Stream& in, int codeLength) {
// now break it up into chars
if (value <= 0x7F)
return Str(value);
else if (value <= 0x7FF)
if (value <= 0x7FF)
return Str(0xC0 + (value >> 6)) + Str(0x80 + (value & 0x3F));
else if (value <= 0xFFFF)
if (value <= 0xFFFF)
return Str(0xE0 + (value >> 12)) + Str(0x80 + ((value >> 6) & 0x3F)) +
Str(0x80 + (value & 0x3F));
else
return Str(0xF0 + (value >> 18)) + Str(0x80 + ((value >> 12) & 0x3F)) +
Str(0x80 + ((value >> 6) & 0x3F)) + Str(0x80 + (value & 0x3F));
return Str(0xF0 + (value >> 18)) + Str(0x80 + ((value >> 12) & 0x3F)) +
Str(0x80 + ((value >> 6) & 0x3F)) + Str(0x80 + (value & 0x3F));
}
// Escape
@@ -104,7 +105,7 @@ std::string Escape(Stream& in) {
case 'e':
return "\x1B";
case ' ':
return "\x20";
return R"( )";
case '\"':
return "\"";
case '\'':
@@ -132,5 +133,5 @@ std::string Escape(Stream& in) {
std::stringstream msg;
throw ParserException(in.mark(), std::string(ErrorMsg::INVALID_ESCAPE) + ch);
}
}
}
} // namespace Exp
} // namespace YAML

View File

@@ -33,15 +33,15 @@ inline const RegEx& Tab() {
return e;
}
inline const RegEx& Blank() {
static const RegEx e = Space() || Tab();
static const RegEx e = Space() | Tab();
return e;
}
inline const RegEx& Break() {
static const RegEx e = RegEx('\n') || RegEx("\r\n");
static const RegEx e = RegEx('\n') | RegEx("\r\n") | RegEx('\r');
return e;
}
inline const RegEx& BlankOrBreak() {
static const RegEx e = Blank() || Break();
static const RegEx e = Blank() | Break();
return e;
}
inline const RegEx& Digit() {
@@ -49,29 +49,29 @@ inline const RegEx& Digit() {
return e;
}
inline const RegEx& Alpha() {
static const RegEx e = RegEx('a', 'z') || RegEx('A', 'Z');
static const RegEx e = RegEx('a', 'z') | RegEx('A', 'Z');
return e;
}
inline const RegEx& AlphaNumeric() {
static const RegEx e = Alpha() || Digit();
static const RegEx e = Alpha() | Digit();
return e;
}
inline const RegEx& Word() {
static const RegEx e = AlphaNumeric() || RegEx('-');
static const RegEx e = AlphaNumeric() | RegEx('-');
return e;
}
inline const RegEx& Hex() {
static const RegEx e = Digit() || RegEx('A', 'F') || RegEx('a', 'f');
static const RegEx e = Digit() | RegEx('A', 'F') | RegEx('a', 'f');
return e;
}
// Valid Unicode code points that are not part of c-printable (YAML 1.2, sec.
// 5.1)
inline const RegEx& NotPrintable() {
static const RegEx e =
RegEx(0) ||
RegEx("\x01\x02\x03\x04\x05\x06\x07\x08\x0B\x0C\x7F", REGEX_OR) ||
RegEx(0x0E, 0x1F) ||
(RegEx('\xC2') + (RegEx('\x80', '\x84') || RegEx('\x86', '\x9F')));
RegEx(0) |
RegEx("\x01\x02\x03\x04\x05\x06\x07\x08\x0B\x0C\x7F", REGEX_OR) |
RegEx(0x0E, 0x1F) |
(RegEx('\xC2') + (RegEx('\x80', '\x84') | RegEx('\x86', '\x9F')));
return e;
}
inline const RegEx& Utf8_ByteOrderMark() {
@@ -82,19 +82,19 @@ inline const RegEx& Utf8_ByteOrderMark() {
// actual tags
inline const RegEx& DocStart() {
static const RegEx e = RegEx("---") + (BlankOrBreak() || RegEx());
static const RegEx e = RegEx("---") + (BlankOrBreak() | RegEx());
return e;
}
inline const RegEx& DocEnd() {
static const RegEx e = RegEx("...") + (BlankOrBreak() || RegEx());
static const RegEx e = RegEx("...") + (BlankOrBreak() | RegEx());
return e;
}
inline const RegEx& DocIndicator() {
static const RegEx e = DocStart() || DocEnd();
static const RegEx e = DocStart() | DocEnd();
return e;
}
inline const RegEx& BlockEntry() {
static const RegEx e = RegEx('-') + (BlankOrBreak() || RegEx());
static const RegEx e = RegEx('-') + (BlankOrBreak() | RegEx());
return e;
}
inline const RegEx& Key() {
@@ -106,36 +106,40 @@ inline const RegEx& KeyInFlow() {
return e;
}
inline const RegEx& Value() {
static const RegEx e = RegEx(':') + (BlankOrBreak() || RegEx());
static const RegEx e = RegEx(':') + (BlankOrBreak() | RegEx());
return e;
}
inline const RegEx& ValueInFlow() {
static const RegEx e = RegEx(':') + (BlankOrBreak() || RegEx(",}", REGEX_OR));
static const RegEx e = RegEx(':') + (BlankOrBreak() | RegEx(",]}", REGEX_OR));
return e;
}
inline const RegEx& ValueInJSONFlow() {
static const RegEx e = RegEx(':');
return e;
}
inline const RegEx& Ampersand() {
static const RegEx e = RegEx('&');
return e;
}
inline const RegEx Comment() {
static const RegEx e = RegEx('#');
return e;
}
inline const RegEx& Anchor() {
static const RegEx e = !(RegEx("[]{},", REGEX_OR) || BlankOrBreak());
static const RegEx e = !(RegEx("[]{},", REGEX_OR) | BlankOrBreak());
return e;
}
inline const RegEx& AnchorEnd() {
static const RegEx e = RegEx("?:,]}%@`", REGEX_OR) || BlankOrBreak();
static const RegEx e = RegEx("?:,]}%@`", REGEX_OR) | BlankOrBreak();
return e;
}
inline const RegEx& URI() {
static const RegEx e = Word() || RegEx("#;/?:@&=+$,_.!~*'()[]", REGEX_OR) ||
static const RegEx e = Word() | RegEx("#;/?:@&=+$,_.!~*'()[]", REGEX_OR) |
(RegEx('%') + Hex() + Hex());
return e;
}
inline const RegEx& Tag() {
static const RegEx e = Word() || RegEx("#;/?:@&=+$_.~*'", REGEX_OR) ||
static const RegEx e = Word() | RegEx("#;/?:@&=+$_.~*'()", REGEX_OR) |
(RegEx('%') + Hex() + Hex());
return e;
}
@@ -148,34 +152,34 @@ inline const RegEx& Tag() {
// space.
inline const RegEx& PlainScalar() {
static const RegEx e =
!(BlankOrBreak() || RegEx(",[]{}#&*!|>\'\"%@`", REGEX_OR) ||
(RegEx("-?:", REGEX_OR) + (BlankOrBreak() || RegEx())));
!(BlankOrBreak() | RegEx(",[]{}#&*!|>\'\"%@`", REGEX_OR) |
(RegEx("-?:", REGEX_OR) + (BlankOrBreak() | RegEx())));
return e;
}
inline const RegEx& PlainScalarInFlow() {
static const RegEx e =
!(BlankOrBreak() || RegEx("?,[]{}#&*!|>\'\"%@`", REGEX_OR) ||
(RegEx("-:", REGEX_OR) + Blank()));
!(BlankOrBreak() | RegEx("?,[]{}#&*!|>\'\"%@`", REGEX_OR) |
(RegEx("-:", REGEX_OR) + (Blank() | RegEx())));
return e;
}
inline const RegEx& EndScalar() {
static const RegEx e = RegEx(':') + (BlankOrBreak() || RegEx());
static const RegEx e = RegEx(':') + (BlankOrBreak() | RegEx());
return e;
}
inline const RegEx& EndScalarInFlow() {
static const RegEx e =
(RegEx(':') + (BlankOrBreak() || RegEx() || RegEx(",]}", REGEX_OR))) ||
(RegEx(':') + (BlankOrBreak() | RegEx() | RegEx(",]}", REGEX_OR))) |
RegEx(",?[]{}", REGEX_OR);
return e;
}
inline const RegEx& ScanScalarEndInFlow() {
static const RegEx e = (EndScalarInFlow() || (BlankOrBreak() + Comment()));
static const RegEx e = (EndScalarInFlow() | (BlankOrBreak() + Comment()));
return e;
}
inline const RegEx& ScanScalarEnd() {
static const RegEx e = EndScalar() || (BlankOrBreak() + Comment());
static const RegEx e = EndScalar() | (BlankOrBreak() + Comment());
return e;
}
inline const RegEx& EscSingleQuote() {
@@ -192,15 +196,15 @@ inline const RegEx& ChompIndicator() {
return e;
}
inline const RegEx& Chomp() {
static const RegEx e = (ChompIndicator() + Digit()) ||
(Digit() + ChompIndicator()) || ChompIndicator() ||
static const RegEx e = (ChompIndicator() + Digit()) |
(Digit() + ChompIndicator()) | ChompIndicator() |
Digit();
return e;
}
// and some functions
std::string Escape(Stream& in);
}
} // namespace Exp
namespace Keys {
const char Directive = '%';
@@ -216,7 +220,7 @@ const char LiteralScalar = '|';
const char FoldedScalar = '>';
const char VerbatimTagStart = '<';
const char VerbatimTagEnd = '>';
}
}
} // namespace Keys
} // namespace YAML
#endif // EXP_H_62B23520_7C8E_11DE_8A39_0800200C9A66

View File

@@ -22,5 +22,5 @@ node& memory::create_node() {
void memory::merge(const memory& rhs) {
m_nodes.insert(rhs.m_nodes.begin(), rhs.m_nodes.end());
}
}
}
} // namespace detail
} // namespace YAML

View File

@@ -9,4 +9,4 @@ Node Clone(const Node& node) {
events.Emit(builder);
return builder.Root();
}
}
} // namespace YAML

View File

@@ -1,4 +1,5 @@
#include <assert.h>
#include <algorithm>
#include <cassert>
#include <iterator>
#include <sstream>
@@ -12,15 +13,24 @@
namespace YAML {
namespace detail {
YAML_CPP_API std::atomic<size_t> node::m_amount{0};
std::string node_data::empty_scalar;
const std::string& node_data::empty_scalar() {
static const std::string svalue;
return svalue;
}
node_data::node_data()
: m_isDefined(false),
m_mark(Mark::null_mark()),
m_type(NodeType::Null),
m_tag{},
m_style(EmitterStyle::Default),
m_seqSize(0) {}
m_scalar{},
m_sequence{},
m_seqSize(0),
m_map{},
m_undefinedPairs{} {}
void node_data::mark_defined() {
if (m_type == NodeType::Undefined)
@@ -100,9 +110,9 @@ void node_data::compute_seq_size() const {
}
void node_data::compute_map_size() const {
kv_pairs::iterator it = m_undefinedPairs.begin();
auto it = m_undefinedPairs.begin();
while (it != m_undefinedPairs.end()) {
kv_pairs::iterator jt = std::next(it);
auto jt = std::next(it);
if (it->first->is_defined() && it->second->is_defined())
m_undefinedPairs.erase(it);
it = jt;
@@ -111,7 +121,7 @@ void node_data::compute_map_size() const {
const_node_iterator node_data::begin() const {
if (!m_isDefined)
return const_node_iterator();
return {};
switch (m_type) {
case NodeType::Sequence:
@@ -119,13 +129,13 @@ const_node_iterator node_data::begin() const {
case NodeType::Map:
return const_node_iterator(m_map.begin(), m_map.end());
default:
return const_node_iterator();
return {};
}
}
node_iterator node_data::begin() {
if (!m_isDefined)
return node_iterator();
return {};
switch (m_type) {
case NodeType::Sequence:
@@ -133,13 +143,13 @@ node_iterator node_data::begin() {
case NodeType::Map:
return node_iterator(m_map.begin(), m_map.end());
default:
return node_iterator();
return {};
}
}
const_node_iterator node_data::end() const {
if (!m_isDefined)
return const_node_iterator();
return {};
switch (m_type) {
case NodeType::Sequence:
@@ -147,13 +157,13 @@ const_node_iterator node_data::end() const {
case NodeType::Map:
return const_node_iterator(m_map.end(), m_map.end());
default:
return const_node_iterator();
return {};
}
}
node_iterator node_data::end() {
if (!m_isDefined)
return node_iterator();
return {};
switch (m_type) {
case NodeType::Sequence:
@@ -161,12 +171,13 @@ node_iterator node_data::end() {
case NodeType::Map:
return node_iterator(m_map.end(), m_map.end());
default:
return node_iterator();
return {};
}
}
// sequence
void node_data::push_back(node& node, shared_memory_holder /* pMemory */) {
void node_data::push_back(node& node,
const shared_memory_holder& /* pMemory */) {
if (m_type == NodeType::Undefined || m_type == NodeType::Null) {
m_type = NodeType::Sequence;
reset_sequence();
@@ -178,7 +189,8 @@ void node_data::push_back(node& node, shared_memory_holder /* pMemory */) {
m_sequence.push_back(&node);
}
void node_data::insert(node& key, node& value, shared_memory_holder pMemory) {
void node_data::insert(node& key, node& value,
const shared_memory_holder& pMemory) {
switch (m_type) {
case NodeType::Map:
break;
@@ -188,27 +200,28 @@ void node_data::insert(node& key, node& value, shared_memory_holder pMemory) {
convert_to_map(pMemory);
break;
case NodeType::Scalar:
throw BadSubscript();
throw BadSubscript(m_mark, key);
}
insert_map_pair(key, value);
}
// indexing
node* node_data::get(node& key, shared_memory_holder /* pMemory */) const {
node* node_data::get(node& key,
const shared_memory_holder& /* pMemory */) const {
if (m_type != NodeType::Map) {
return NULL;
return nullptr;
}
for (node_map::const_iterator it = m_map.begin(); it != m_map.end(); ++it) {
if (it->first->is(key))
return it->second;
for (const auto& it : m_map) {
if (it.first->is(key))
return it.second;
}
return NULL;
return nullptr;
}
node& node_data::get(node& key, shared_memory_holder pMemory) {
node& node_data::get(node& key, const shared_memory_holder& pMemory) {
switch (m_type) {
case NodeType::Map:
break;
@@ -218,12 +231,12 @@ node& node_data::get(node& key, shared_memory_holder pMemory) {
convert_to_map(pMemory);
break;
case NodeType::Scalar:
throw BadSubscript();
throw BadSubscript(m_mark, key);
}
for (node_map::const_iterator it = m_map.begin(); it != m_map.end(); ++it) {
if (it->first->is(key))
return *it->second;
for (const auto& it : m_map) {
if (it.first->is(key))
return *it.second;
}
node& value = pMemory->create_node();
@@ -231,15 +244,26 @@ node& node_data::get(node& key, shared_memory_holder pMemory) {
return value;
}
bool node_data::remove(node& key, shared_memory_holder /* pMemory */) {
bool node_data::remove(node& key, const shared_memory_holder& /* pMemory */) {
if (m_type != NodeType::Map)
return false;
for (node_map::iterator it = m_map.begin(); it != m_map.end(); ++it) {
if (it->first->is(key)) {
m_map.erase(it);
return true;
}
for (auto it = m_undefinedPairs.begin(); it != m_undefinedPairs.end();) {
auto jt = std::next(it);
if (it->first->is(key))
m_undefinedPairs.erase(it);
it = jt;
}
auto it =
std::find_if(m_map.begin(), m_map.end(),
[&](std::pair<YAML::detail::node*, YAML::detail::node*> j) {
return (j.first->is(key));
});
if (it != m_map.end()) {
m_map.erase(it);
return true;
}
return false;
@@ -262,7 +286,7 @@ void node_data::insert_map_pair(node& key, node& value) {
m_undefinedPairs.emplace_back(&key, &value);
}
void node_data::convert_to_map(shared_memory_holder pMemory) {
void node_data::convert_to_map(const shared_memory_holder& pMemory) {
switch (m_type) {
case NodeType::Undefined:
case NodeType::Null:
@@ -280,7 +304,7 @@ void node_data::convert_to_map(shared_memory_holder pMemory) {
}
}
void node_data::convert_sequence_to_map(shared_memory_holder pMemory) {
void node_data::convert_sequence_to_map(const shared_memory_holder& pMemory) {
assert(m_type == NodeType::Sequence);
reset_map();
@@ -296,5 +320,5 @@ void node_data::convert_sequence_to_map(shared_memory_holder pMemory) {
reset_sequence();
m_type = NodeType::Map;
}
}
}
} // namespace detail
} // namespace YAML

View File

@@ -1,4 +1,3 @@
#include <assert.h>
#include <cassert>
#include "nodebuilder.h"
@@ -11,11 +10,16 @@ namespace YAML {
struct Mark;
NodeBuilder::NodeBuilder()
: m_pMemory(new detail::memory_holder), m_pRoot(0), m_mapDepth(0) {
m_anchors.push_back(0); // since the anchors start at 1
: m_pMemory(new detail::memory_holder),
m_pRoot(nullptr),
m_stack{},
m_anchors{},
m_keys{},
m_mapDepth(0) {
m_anchors.push_back(nullptr); // since the anchors start at 1
}
NodeBuilder::~NodeBuilder() {}
NodeBuilder::~NodeBuilder() = default;
Node NodeBuilder::Root() {
if (!m_pRoot)
@@ -88,7 +92,7 @@ void NodeBuilder::Push(detail::node& node) {
m_stack.push_back(&node);
if (needsKey)
m_keys.push_back(PushedKey(&node, false));
m_keys.emplace_back(&node, false);
}
void NodeBuilder::Pop() {
@@ -127,4 +131,4 @@ void NodeBuilder::RegisterAnchor(anchor_t anchor, detail::node& node) {
m_anchors.push_back(&node);
}
}
}
} // namespace YAML

View File

@@ -27,25 +27,29 @@ class Node;
class NodeBuilder : public EventHandler {
public:
NodeBuilder();
virtual ~NodeBuilder();
NodeBuilder(const NodeBuilder&) = delete;
NodeBuilder(NodeBuilder&&) = delete;
NodeBuilder& operator=(const NodeBuilder&) = delete;
NodeBuilder& operator=(NodeBuilder&&) = delete;
~NodeBuilder() override;
Node Root();
virtual void OnDocumentStart(const Mark& mark);
virtual void OnDocumentEnd();
void OnDocumentStart(const Mark& mark) override;
void OnDocumentEnd() override;
virtual void OnNull(const Mark& mark, anchor_t anchor);
virtual void OnAlias(const Mark& mark, anchor_t anchor);
virtual void OnScalar(const Mark& mark, const std::string& tag,
anchor_t anchor, const std::string& value);
void OnNull(const Mark& mark, anchor_t anchor) override;
void OnAlias(const Mark& mark, anchor_t anchor) override;
void OnScalar(const Mark& mark, const std::string& tag,
anchor_t anchor, const std::string& value) override;
virtual void OnSequenceStart(const Mark& mark, const std::string& tag,
anchor_t anchor, EmitterStyle::value style);
virtual void OnSequenceEnd();
void OnSequenceStart(const Mark& mark, const std::string& tag,
anchor_t anchor, EmitterStyle::value style) override;
void OnSequenceEnd() override;
virtual void OnMapStart(const Mark& mark, const std::string& tag,
anchor_t anchor, EmitterStyle::value style);
virtual void OnMapEnd();
void OnMapStart(const Mark& mark, const std::string& tag,
anchor_t anchor, EmitterStyle::value style) override;
void OnMapEnd() override;
private:
detail::node& Push(const Mark& mark, anchor_t anchor);
@@ -57,14 +61,14 @@ class NodeBuilder : public EventHandler {
detail::shared_memory_holder m_pMemory;
detail::node* m_pRoot;
typedef std::vector<detail::node*> Nodes;
using Nodes = std::vector<detail::node *>;
Nodes m_stack;
Nodes m_anchors;
typedef std::pair<detail::node*, bool> PushedKey;
using PushedKey = std::pair<detail::node*, bool>;
std::vector<PushedKey> m_keys;
std::size_t m_mapDepth;
};
}
} // namespace YAML
#endif // NODE_NODEBUILDER_H_62B23520_7C8E_11DE_8A39_0800200C9A66

View File

@@ -13,14 +13,14 @@ void NodeEvents::AliasManager::RegisterReference(const detail::node& node) {
anchor_t NodeEvents::AliasManager::LookupAnchor(
const detail::node& node) const {
AnchorByIdentity::const_iterator it = m_anchorByIdentity.find(node.ref());
auto it = m_anchorByIdentity.find(node.ref());
if (it == m_anchorByIdentity.end())
return 0;
return it->second;
}
NodeEvents::NodeEvents(const Node& node)
: m_pMemory(node.m_pMemory), m_root(node.m_pNode) {
: m_pMemory(node.m_pMemory), m_root(node.m_pNode), m_refCount{} {
if (m_root)
Setup(*m_root);
}
@@ -32,13 +32,12 @@ void NodeEvents::Setup(const detail::node& node) {
return;
if (node.type() == NodeType::Sequence) {
for (detail::const_node_iterator it = node.begin(); it != node.end(); ++it)
Setup(**it);
for (auto element : node)
Setup(*element);
} else if (node.type() == NodeType::Map) {
for (detail::const_node_iterator it = node.begin(); it != node.end();
++it) {
Setup(*it->first);
Setup(*it->second);
for (auto element : node) {
Setup(*element.first);
Setup(*element.second);
}
}
}
@@ -77,17 +76,15 @@ void NodeEvents::Emit(const detail::node& node, EventHandler& handler,
break;
case NodeType::Sequence:
handler.OnSequenceStart(Mark(), node.tag(), anchor, node.style());
for (detail::const_node_iterator it = node.begin(); it != node.end();
++it)
Emit(**it, handler, am);
for (auto element : node)
Emit(*element, handler, am);
handler.OnSequenceEnd();
break;
case NodeType::Map:
handler.OnMapStart(Mark(), node.tag(), anchor, node.style());
for (detail::const_node_iterator it = node.begin(); it != node.end();
++it) {
Emit(*it->first, handler, am);
Emit(*it->second, handler, am);
for (auto element : node) {
Emit(*element.first, handler, am);
Emit(*element.second, handler, am);
}
handler.OnMapEnd();
break;
@@ -95,7 +92,7 @@ void NodeEvents::Emit(const detail::node& node, EventHandler& handler,
}
bool NodeEvents::IsAliased(const detail::node& node) const {
RefCount::const_iterator it = m_refCount.find(node.ref());
auto it = m_refCount.find(node.ref());
return it != m_refCount.end() && it->second > 1;
}
}
} // namespace YAML

View File

@@ -26,13 +26,17 @@ class Node;
class NodeEvents {
public:
explicit NodeEvents(const Node& node);
NodeEvents(const NodeEvents&) = delete;
NodeEvents(NodeEvents&&) = delete;
NodeEvents& operator=(const NodeEvents&) = delete;
NodeEvents& operator=(NodeEvents&&) = delete;
void Emit(EventHandler& handler);
private:
class AliasManager {
public:
AliasManager() : m_curAnchor(0) {}
AliasManager() : m_anchorByIdentity{}, m_curAnchor(0) {}
void RegisterReference(const detail::node& node);
anchor_t LookupAnchor(const detail::node& node) const;
@@ -41,7 +45,7 @@ class NodeEvents {
anchor_t _CreateNewAnchor() { return ++m_curAnchor; }
private:
typedef std::map<const detail::node_ref*, anchor_t> AnchorByIdentity;
using AnchorByIdentity = std::map<const detail::node_ref*, anchor_t>;
AnchorByIdentity m_anchorByIdentity;
anchor_t m_curAnchor;
@@ -56,9 +60,9 @@ class NodeEvents {
detail::shared_memory_holder m_pMemory;
detail::node* m_root;
typedef std::map<const detail::node_ref*, int> RefCount;
using RefCount = std::map<const detail::node_ref*, int>;
RefCount m_refCount;
};
}
} // namespace YAML
#endif // NODE_NODEEVENTS_H_62B23520_7C8E_11DE_8A39_0800200C9A66

View File

@@ -7,4 +7,4 @@ bool IsNullString(const std::string& str) {
return str.empty() || str == "~" || str == "null" || str == "Null" ||
str == "NULL";
}
}
} // namespace YAML

View File

@@ -7,16 +7,21 @@
namespace YAML {
ostream_wrapper::ostream_wrapper()
: m_buffer(1, '\0'),
m_pStream(0),
m_pStream(nullptr),
m_pos(0),
m_row(0),
m_col(0),
m_comment(false) {}
ostream_wrapper::ostream_wrapper(std::ostream& stream)
: m_pStream(&stream), m_pos(0), m_row(0), m_col(0), m_comment(false) {}
: m_buffer{},
m_pStream(&stream),
m_pos(0),
m_row(0),
m_col(0),
m_comment(false) {}
ostream_wrapper::~ostream_wrapper() {}
ostream_wrapper::~ostream_wrapper() = default;
void ostream_wrapper::write(const std::string& str) {
if (m_pStream) {
@@ -26,8 +31,8 @@ void ostream_wrapper::write(const std::string& str) {
std::copy(str.begin(), str.end(), m_buffer.begin() + m_pos);
}
for (std::size_t i = 0; i < str.size(); i++) {
update_pos(str[i]);
for (char ch : str) {
update_pos(ch);
}
}
@@ -54,4 +59,4 @@ void ostream_wrapper::update_pos(char ch) {
m_comment = false;
}
}
}
} // namespace YAML

View File

@@ -3,10 +3,10 @@
#include <fstream>
#include <sstream>
#include "yaml-cpp/node/node.h"
#include "yaml-cpp/node/impl.h"
#include "yaml-cpp/parser.h"
#include "nodebuilder.h"
#include "yaml-cpp/node/impl.h"
#include "yaml-cpp/node/node.h"
#include "yaml-cpp/parser.h"
namespace YAML {
Node Load(const std::string& input) {
@@ -30,9 +30,9 @@ Node Load(std::istream& input) {
}
Node LoadFile(const std::string& filename) {
std::ifstream fin(filename.c_str());
if (!fin || fin.bad()) {
throw BadFile();
std::ifstream fin(filename);
if (!fin) {
throw BadFile(filename);
}
return Load(fin);
}
@@ -51,7 +51,7 @@ std::vector<Node> LoadAll(std::istream& input) {
std::vector<Node> docs;
Parser parser(input);
while (1) {
while (true) {
NodeBuilder builder;
if (!parser.HandleNextDocument(builder)) {
break;
@@ -63,9 +63,9 @@ std::vector<Node> LoadAll(std::istream& input) {
}
std::vector<Node> LoadAllFromFile(const std::string& filename) {
std::ifstream fin(filename.c_str());
std::ifstream fin(filename);
if (!fin) {
throw BadFile();
throw BadFile(filename);
}
return LoadAll(fin);
}

View File

@@ -11,15 +11,13 @@
namespace YAML {
class EventHandler;
Parser::Parser() {}
Parser::Parser() : m_pScanner{}, m_pDirectives{} {}
Parser::Parser(std::istream& in) { Load(in); }
Parser::Parser(std::istream& in) : Parser() { Load(in); }
Parser::~Parser() {}
Parser::~Parser() = default;
Parser::operator bool() const {
return m_pScanner.get() && !m_pScanner->empty();
}
Parser::operator bool() const { return m_pScanner && !m_pScanner->empty(); }
void Parser::Load(std::istream& in) {
m_pScanner.reset(new Scanner(in));
@@ -27,7 +25,7 @@ void Parser::Load(std::istream& in) {
}
bool Parser::HandleNextDocument(EventHandler& eventHandler) {
if (!m_pScanner.get())
if (!m_pScanner)
return false;
ParseDirectives();
@@ -43,11 +41,7 @@ bool Parser::HandleNextDocument(EventHandler& eventHandler) {
void Parser::ParseDirectives() {
bool readDirective = false;
while (1) {
if (m_pScanner->empty()) {
break;
}
while (!m_pScanner->empty()) {
Token& token = m_pScanner->peek();
if (token.type != Token::DIRECTIVE) {
break;
@@ -113,17 +107,13 @@ void Parser::HandleTagDirective(const Token& token) {
}
void Parser::PrintTokens(std::ostream& out) {
if (!m_pScanner.get()) {
if (!m_pScanner) {
return;
}
while (1) {
if (m_pScanner->empty()) {
break;
}
while (!m_pScanner->empty()) {
out << m_pScanner->peek() << "\n";
m_pScanner->pop();
}
}
}
} // namespace YAML

View File

@@ -12,15 +12,17 @@
#include <memory>
#include <vector>
#include "yaml-cpp/noncopyable.h"
namespace YAML {
// TODO: This class is no longer needed
template <typename T>
class ptr_vector : private YAML::noncopyable {
class ptr_vector {
public:
ptr_vector() {}
ptr_vector() : m_data{} {}
ptr_vector(const ptr_vector&) = delete;
ptr_vector(ptr_vector&&) = default;
ptr_vector& operator=(const ptr_vector&) = delete;
ptr_vector& operator=(ptr_vector&&) = default;
void clear() { m_data.clear(); }
@@ -38,6 +40,6 @@ class ptr_vector : private YAML::noncopyable {
private:
std::vector<std::unique_ptr<T>> m_data;
};
}
} // namespace YAML
#endif // PTR_VECTOR_H_62B23520_7C8E_11DE_8A39_0800200C9A66

View File

@@ -2,18 +2,16 @@
namespace YAML {
// constructors
RegEx::RegEx() : m_op(REGEX_EMPTY) {}
RegEx::RegEx(REGEX_OP op) : m_op(op) {}
RegEx::RegEx(REGEX_OP op) : m_op(op), m_a(0), m_z(0), m_params{} {}
RegEx::RegEx() : RegEx(REGEX_EMPTY) {}
RegEx::RegEx(char ch) : m_op(REGEX_MATCH), m_a(ch) {}
RegEx::RegEx(char ch) : m_op(REGEX_MATCH), m_a(ch), m_z(0), m_params{} {}
RegEx::RegEx(char a, char z) : m_op(REGEX_RANGE), m_a(a), m_z(z) {}
RegEx::RegEx(char a, char z) : m_op(REGEX_RANGE), m_a(a), m_z(z), m_params{} {}
RegEx::RegEx(const std::string& str, REGEX_OP op) : m_op(op) {
for (std::size_t i = 0; i < str.size(); i++)
m_params.push_back(RegEx(str[i]));
}
RegEx::RegEx(const std::string& str, REGEX_OP op)
: m_op(op), m_a(0), m_z(0), m_params(str.begin(), str.end()) {}
// combination constructors
RegEx operator!(const RegEx& ex) {
@@ -22,14 +20,14 @@ RegEx operator!(const RegEx& ex) {
return ret;
}
RegEx operator||(const RegEx& ex1, const RegEx& ex2) {
RegEx operator|(const RegEx& ex1, const RegEx& ex2) {
RegEx ret(REGEX_OR);
ret.m_params.push_back(ex1);
ret.m_params.push_back(ex2);
return ret;
}
RegEx operator&&(const RegEx& ex1, const RegEx& ex2) {
RegEx operator&(const RegEx& ex1, const RegEx& ex2) {
RegEx ret(REGEX_AND);
ret.m_params.push_back(ex1);
ret.m_params.push_back(ex2);
@@ -42,4 +40,4 @@ RegEx operator+(const RegEx& ex1, const RegEx& ex2) {
ret.m_params.push_back(ex2);
return ret;
}
}
} // namespace YAML

View File

@@ -31,14 +31,14 @@ enum REGEX_OP {
class YAML_CPP_API RegEx {
public:
RegEx();
RegEx(char ch);
explicit RegEx(char ch);
RegEx(char a, char z);
RegEx(const std::string& str, REGEX_OP op = REGEX_SEQ);
~RegEx() {}
~RegEx() = default;
friend YAML_CPP_API RegEx operator!(const RegEx& ex);
friend YAML_CPP_API RegEx operator||(const RegEx& ex1, const RegEx& ex2);
friend YAML_CPP_API RegEx operator&&(const RegEx& ex1, const RegEx& ex2);
friend YAML_CPP_API RegEx operator|(const RegEx& ex1, const RegEx& ex2);
friend YAML_CPP_API RegEx operator&(const RegEx& ex1, const RegEx& ex2);
friend YAML_CPP_API RegEx operator+(const RegEx& ex1, const RegEx& ex2);
bool Matches(char ch) const;
@@ -53,7 +53,7 @@ class YAML_CPP_API RegEx {
int Match(const Source& source) const;
private:
RegEx(REGEX_OP op);
explicit RegEx(REGEX_OP op);
template <typename Source>
bool IsValidSource(const Source& source) const;
@@ -77,10 +77,11 @@ class YAML_CPP_API RegEx {
private:
REGEX_OP m_op;
char m_a, m_z;
char m_a{};
char m_z{};
std::vector<RegEx> m_params;
};
}
} // namespace YAML
#include "regeximpl.h"

View File

@@ -8,8 +8,8 @@
#endif
#include "stream.h"
#include "stringsource.h"
#include "streamcharsource.h"
#include "stringsource.h"
namespace YAML {
// query matches
@@ -106,9 +106,8 @@ inline int RegEx::MatchOpEmpty(const Source& source) const {
template <>
inline int RegEx::MatchOpEmpty<StringCharSource>(
const StringCharSource& source) const {
return !source
? 0
: -1; // the empty regex only is successful on the empty string
return !source ? 0 : -1; // the empty regex only is successful on the empty
// string
}
// MatchOperator
@@ -130,8 +129,8 @@ inline int RegEx::MatchOpRange(const Source& source) const {
// OrOperator
template <typename Source>
inline int RegEx::MatchOpOr(const Source& source) const {
for (std::size_t i = 0; i < m_params.size(); i++) {
int n = m_params[i].MatchUnchecked(source);
for (const RegEx& param : m_params) {
int n = param.MatchUnchecked(source);
if (n >= 0)
return n;
}
@@ -169,11 +168,11 @@ inline int RegEx::MatchOpNot(const Source& source) const {
template <typename Source>
inline int RegEx::MatchOpSeq(const Source& source) const {
int offset = 0;
for (std::size_t i = 0; i < m_params.size(); i++) {
int n = m_params[i].Match(source + offset); // note Match, not
// MatchUnchecked because we
// need to check validity after
// the offset
for (const RegEx& param : m_params) {
int n = param.Match(source + offset); // note Match, not
// MatchUnchecked because we
// need to check validity after
// the offset
if (n == -1)
return -1;
offset += n;
@@ -181,6 +180,6 @@ inline int RegEx::MatchOpSeq(const Source& source) const {
return offset;
}
}
} // namespace YAML
#endif // REGEXIMPL_H_62B23520_7C8E_11DE_8A39_0800200C9A66

View File

@@ -9,12 +9,17 @@
namespace YAML {
Scanner::Scanner(std::istream& in)
: INPUT(in),
m_tokens{},
m_startedStream(false),
m_endedStream(false),
m_simpleKeyAllowed(false),
m_canBeJSONFlow(false) {}
m_canBeJSONFlow(false),
m_simpleKeys{},
m_indents{},
m_indentRefs{},
m_flows{} {}
Scanner::~Scanner() {}
Scanner::~Scanner() = default;
bool Scanner::empty() {
EnsureTokensInQueue();
@@ -46,7 +51,7 @@ Token& Scanner::peek() {
Mark Scanner::mark() const { return INPUT.mark(); }
void Scanner::EnsureTokensInQueue() {
while (1) {
while (true) {
if (!m_tokens.empty()) {
Token& token = m_tokens.front();
@@ -83,7 +88,7 @@ void Scanner::ScanNextToken() {
return StartStream();
}
// get rid of whitespace, etc. (in between tokens it should be irrelevent)
// get rid of whitespace, etc. (in between tokens it should be irrelevant)
ScanToNextToken();
// maybe need to end some blocks
@@ -169,7 +174,7 @@ void Scanner::ScanNextToken() {
}
void Scanner::ScanToNextToken() {
while (1) {
while (true) {
// first eat whitespace
while (INPUT && IsWhitespaceToBeEaten(INPUT.peek())) {
if (InBlockContext() && Exp::Tab().Matches(INPUT)) {
@@ -282,7 +287,7 @@ Scanner::IndentMarker* Scanner::PushIndentTo(int column,
IndentMarker::INDENT_TYPE type) {
// are we in flow?
if (InFlowContext()) {
return 0;
return nullptr;
}
std::unique_ptr<IndentMarker> pIndent(new IndentMarker(column, type));
@@ -291,12 +296,12 @@ Scanner::IndentMarker* Scanner::PushIndentTo(int column,
// is this actually an indentation?
if (indent.column < lastIndent.column) {
return 0;
return nullptr;
}
if (indent.column == lastIndent.column &&
!(indent.type == IndentMarker::SEQ &&
lastIndent.type == IndentMarker::MAP)) {
return 0;
return nullptr;
}
// push a start token

View File

@@ -9,9 +9,7 @@
#include <cstddef>
#include <ios>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
@@ -49,7 +47,7 @@ class Scanner {
enum INDENT_TYPE { MAP, SEQ, NONE };
enum STATUS { VALID, INVALID, UNKNOWN };
IndentMarker(int column_, INDENT_TYPE type_)
: column(column_), type(type_), status(VALID), pStartToken(0) {}
: column(column_), type(type_), status(VALID), pStartToken(nullptr) {}
int column;
INDENT_TYPE type;

View File

@@ -47,7 +47,8 @@ std::string ScanScalar(Stream& INPUT, ScanScalarParams& params) {
if (INPUT.column() == 0 && Exp::DocIndicator().Matches(INPUT)) {
if (params.onDocIndicator == BREAK) {
break;
} else if (params.onDocIndicator == THROW) {
}
if (params.onDocIndicator == THROW) {
throw ParserException(INPUT.mark(), ErrorMsg::DOC_IN_SCALAR);
}
}
@@ -183,7 +184,7 @@ std::string ScanScalar(Stream& INPUT, ScanScalarParams& params) {
case FOLD_FLOW:
if (nextEmptyLine) {
scalar += "\n";
} else if (!emptyLine && !nextEmptyLine && !escapedNewline) {
} else if (!emptyLine && !escapedNewline) {
scalar += " ";
}
break;
@@ -203,7 +204,7 @@ std::string ScanScalar(Stream& INPUT, ScanScalarParams& params) {
// post-processing
if (params.trimTrailingSpaces) {
std::size_t pos = scalar.find_last_not_of(' ');
std::size_t pos = scalar.find_last_not_of(" \t");
if (lastEscapedChar != std::string::npos) {
if (pos < lastEscapedChar || pos == std::string::npos) {
pos = lastEscapedChar;
@@ -247,4 +248,4 @@ std::string ScanScalar(Stream& INPUT, ScanScalarParams& params) {
return scalar;
}
}
} // namespace YAML

View File

@@ -57,7 +57,7 @@ struct ScanScalarParams {
bool leadingSpaces;
};
std::string ScanScalar(Stream& INPUT, ScanScalarParams& info);
std::string ScanScalar(Stream& INPUT, ScanScalarParams& params);
}
#endif // SCANSCALAR_H_62B23520_7C8E_11DE_8A39_0800200C9A66

View File

@@ -78,4 +78,4 @@ const std::string ScanTagSuffix(Stream& INPUT) {
return tag;
}
}
} // namespace YAML

View File

@@ -37,7 +37,7 @@ void Scanner::ScanDirective() {
token.value += INPUT.get();
// read parameters
while (1) {
while (true) {
// first get rid of whitespace
while (Exp::Blank().Matches(INPUT))
INPUT.eat(1);
@@ -171,7 +171,7 @@ void Scanner::ScanBlockEntry() {
// Key
void Scanner::ScanKey() {
// handle keys diffently in the block context (and manage indents)
// handle keys differently in the block context (and manage indents)
if (InBlockContext()) {
if (!m_simpleKeyAllowed)
throw ParserException(INPUT.mark(), ErrorMsg::MAP_KEY);
@@ -199,7 +199,7 @@ void Scanner::ScanValue() {
// seems fine)
m_simpleKeyAllowed = false;
} else {
// handle values diffently in the block context (and manage indents)
// handle values differently in the block context (and manage indents)
if (InBlockContext()) {
if (!m_simpleKeyAllowed)
throw ParserException(INPUT.mark(), ErrorMsg::MAP_VALUE);
@@ -338,7 +338,7 @@ void Scanner::ScanQuotedScalar() {
// setup the scanning parameters
ScanScalarParams params;
RegEx end = (single ? RegEx(quote) && !Exp::EscSingleQuote() : RegEx(quote));
RegEx end = (single ? RegEx(quote) & !Exp::EscSingleQuote() : RegEx(quote));
params.end = &end;
params.eatEnd = true;
params.escape = (single ? '\'' : '\\');
@@ -434,4 +434,4 @@ void Scanner::ScanBlockScalar() {
token.value = scalar;
m_tokens.push(token);
}
}
} // namespace YAML

View File

@@ -7,17 +7,24 @@
#pragma once
#endif
#include "yaml-cpp/noexcept.h"
#include <memory>
#include <utility>
#include <vector>
#include "yaml-cpp/noncopyable.h"
namespace YAML {
class SettingChangeBase;
class SettingChangeBase {
public:
virtual ~SettingChangeBase() = default;
virtual void pop() = 0;
};
template <typename T>
class Setting {
public:
Setting() : m_value() {}
Setting(const T& value) : m_value() { set(value); }
const T get() const { return m_value; }
std::unique_ptr<SettingChangeBase> set(const T& value);
@@ -27,21 +34,19 @@ class Setting {
T m_value;
};
class SettingChangeBase {
public:
virtual ~SettingChangeBase() {}
virtual void pop() = 0;
};
template <typename T>
class SettingChange : public SettingChangeBase {
public:
SettingChange(Setting<T>* pSetting) : m_pCurSetting(pSetting) {
// copy old setting to save its state
m_oldSetting = *pSetting;
}
SettingChange(Setting<T>* pSetting)
: m_pCurSetting(pSetting),
m_oldSetting(*pSetting) // copy old setting to save its state
{}
SettingChange(const SettingChange&) = delete;
SettingChange(SettingChange&&) = delete;
SettingChange& operator=(const SettingChange&) = delete;
SettingChange& operator=(SettingChange&&) = delete;
virtual void pop() { m_pCurSetting->restore(m_oldSetting); }
void pop() override { m_pCurSetting->restore(m_oldSetting); }
private:
Setting<T>* m_pCurSetting;
@@ -55,28 +60,13 @@ inline std::unique_ptr<SettingChangeBase> Setting<T>::set(const T& value) {
return pChange;
}
class SettingChanges : private noncopyable {
class SettingChanges {
public:
SettingChanges() {}
~SettingChanges() { clear(); }
void clear() {
restore();
m_settingChanges.clear();
}
void restore() {
for (setting_changes::const_iterator it = m_settingChanges.begin();
it != m_settingChanges.end(); ++it)
(*it)->pop();
}
void push(std::unique_ptr<SettingChangeBase> pSettingChange) {
m_settingChanges.push_back(std::move(pSettingChange));
}
// like std::unique_ptr - assignment is transfer of ownership
SettingChanges& operator=(SettingChanges&& rhs) {
SettingChanges() : m_settingChanges{} {}
SettingChanges(const SettingChanges&) = delete;
SettingChanges(SettingChanges&&) YAML_CPP_NOEXCEPT = default;
SettingChanges& operator=(const SettingChanges&) = delete;
SettingChanges& operator=(SettingChanges&& rhs) YAML_CPP_NOEXCEPT {
if (this == &rhs)
return *this;
@@ -85,11 +75,26 @@ class SettingChanges : private noncopyable {
return *this;
}
~SettingChanges() { clear(); }
void clear() YAML_CPP_NOEXCEPT {
restore();
m_settingChanges.clear();
}
void restore() YAML_CPP_NOEXCEPT {
for (const auto& setting : m_settingChanges)
setting->pop();
}
void push(std::unique_ptr<SettingChangeBase> pSettingChange) {
m_settingChanges.push_back(std::move(pSettingChange));
}
private:
typedef std::vector<std::unique_ptr<SettingChangeBase>> setting_changes;
using setting_changes = std::vector<std::unique_ptr<SettingChangeBase>>;
setting_changes m_settingChanges;
};
}
} // namespace YAML
#endif // SETTING_H_62B23520_7C8E_11DE_8A39_0800200C9A66

View File

@@ -5,7 +5,11 @@ namespace YAML {
struct Mark;
Scanner::SimpleKey::SimpleKey(const Mark& mark_, std::size_t flowLevel_)
: mark(mark_), flowLevel(flowLevel_), pIndent(0), pMapStart(0), pKey(0) {}
: mark(mark_),
flowLevel(flowLevel_),
pIndent(nullptr),
pMapStart(nullptr),
pKey(nullptr) {}
void Scanner::SimpleKey::Validate() {
// Note: pIndent will *not* be garbage here;
@@ -125,4 +129,4 @@ void Scanner::PopAllSimpleKeys() {
while (!m_simpleKeys.empty())
m_simpleKeys.pop();
}
}
} // namespace YAML

View File

@@ -7,6 +7,7 @@
#include "singledocparser.h"
#include "tag.h"
#include "token.h"
#include "yaml-cpp/depthguard.h"
#include "yaml-cpp/emitterstyle.h"
#include "yaml-cpp/eventhandler.h"
#include "yaml-cpp/exceptions.h" // IWYU pragma: keep
@@ -18,9 +19,10 @@ SingleDocParser::SingleDocParser(Scanner& scanner, const Directives& directives)
: m_scanner(scanner),
m_directives(directives),
m_pCollectionStack(new CollectionStack),
m_anchors{},
m_curAnchor(0) {}
SingleDocParser::~SingleDocParser() {}
SingleDocParser::~SingleDocParser() = default;
// HandleDocument
// . Handles the next document
@@ -46,6 +48,8 @@ void SingleDocParser::HandleDocument(EventHandler& eventHandler) {
}
void SingleDocParser::HandleNode(EventHandler& eventHandler) {
DepthGuard<500> depthguard(depth, m_scanner.mark(), ErrorMsg::BAD_FILE);
// an empty node *is* a possibility
if (m_scanner.empty()) {
eventHandler.OnNull(m_scanner.mark(), NullAnchor);
@@ -71,20 +75,31 @@ void SingleDocParser::HandleNode(EventHandler& eventHandler) {
}
std::string tag;
std::string anchor_name;
anchor_t anchor;
ParseProperties(tag, anchor);
ParseProperties(tag, anchor, anchor_name);
const Token& token = m_scanner.peek();
if (!anchor_name.empty())
eventHandler.OnAnchor(mark, anchor_name);
if (token.type == Token::PLAIN_SCALAR && IsNullString(token.value)) {
// after parsing properties, an empty node is again a possibility
if (m_scanner.empty()) {
eventHandler.OnNull(mark, anchor);
m_scanner.pop();
return;
}
const Token& token = m_scanner.peek();
// add non-specific tags
if (tag.empty())
tag = (token.type == Token::NON_PLAIN_SCALAR ? "!" : "?");
if (token.type == Token::PLAIN_SCALAR
&& tag.compare("?") == 0 && IsNullString(token.value)) {
eventHandler.OnNull(mark, anchor);
m_scanner.pop();
return;
}
// now split based on what kind of node we should be
switch (token.type) {
@@ -152,7 +167,7 @@ void SingleDocParser::HandleBlockSequence(EventHandler& eventHandler) {
m_scanner.pop();
m_pCollectionStack->PushCollectionType(CollectionType::BlockSeq);
while (1) {
while (true) {
if (m_scanner.empty())
throw ParserException(m_scanner.mark(), ErrorMsg::END_OF_SEQ);
@@ -166,10 +181,10 @@ void SingleDocParser::HandleBlockSequence(EventHandler& eventHandler) {
// check for null
if (!m_scanner.empty()) {
const Token& token_ = m_scanner.peek();
if (token_.type == Token::BLOCK_ENTRY ||
token_.type == Token::BLOCK_SEQ_END) {
eventHandler.OnNull(token_.mark, NullAnchor);
const Token& nextToken = m_scanner.peek();
if (nextToken.type == Token::BLOCK_ENTRY ||
nextToken.type == Token::BLOCK_SEQ_END) {
eventHandler.OnNull(nextToken.mark, NullAnchor);
continue;
}
}
@@ -185,7 +200,7 @@ void SingleDocParser::HandleFlowSequence(EventHandler& eventHandler) {
m_scanner.pop();
m_pCollectionStack->PushCollectionType(CollectionType::FlowSeq);
while (1) {
while (true) {
if (m_scanner.empty())
throw ParserException(m_scanner.mark(), ErrorMsg::END_OF_SEQ_FLOW);
@@ -238,7 +253,7 @@ void SingleDocParser::HandleBlockMap(EventHandler& eventHandler) {
m_scanner.pop();
m_pCollectionStack->PushCollectionType(CollectionType::BlockMap);
while (1) {
while (true) {
if (m_scanner.empty())
throw ParserException(m_scanner.mark(), ErrorMsg::END_OF_MAP);
@@ -277,7 +292,7 @@ void SingleDocParser::HandleFlowMap(EventHandler& eventHandler) {
m_scanner.pop();
m_pCollectionStack->PushCollectionType(CollectionType::FlowMap);
while (1) {
while (true) {
if (m_scanner.empty())
throw ParserException(m_scanner.mark(), ErrorMsg::END_OF_MAP_FLOW);
@@ -356,11 +371,13 @@ void SingleDocParser::HandleCompactMapWithNoKey(EventHandler& eventHandler) {
// ParseProperties
// . Grabs any tag or anchor tokens and deals with them.
void SingleDocParser::ParseProperties(std::string& tag, anchor_t& anchor) {
void SingleDocParser::ParseProperties(std::string& tag, anchor_t& anchor,
std::string& anchor_name) {
tag.clear();
anchor_name.clear();
anchor = NullAnchor;
while (1) {
while (true) {
if (m_scanner.empty())
return;
@@ -369,7 +386,7 @@ void SingleDocParser::ParseProperties(std::string& tag, anchor_t& anchor) {
ParseTag(tag);
break;
case Token::ANCHOR:
ParseAnchor(anchor);
ParseAnchor(anchor, anchor_name);
break;
default:
return;
@@ -387,11 +404,12 @@ void SingleDocParser::ParseTag(std::string& tag) {
m_scanner.pop();
}
void SingleDocParser::ParseAnchor(anchor_t& anchor) {
void SingleDocParser::ParseAnchor(anchor_t& anchor, std::string& anchor_name) {
Token& token = m_scanner.peek();
if (anchor)
throw ParserException(token.mark, ErrorMsg::MULTIPLE_ANCHORS);
anchor_name = token.value;
anchor = RegisterAnchor(token.value);
m_scanner.pop();
}
@@ -405,10 +423,13 @@ anchor_t SingleDocParser::RegisterAnchor(const std::string& name) {
anchor_t SingleDocParser::LookupAnchor(const Mark& mark,
const std::string& name) const {
Anchors::const_iterator it = m_anchors.find(name);
if (it == m_anchors.end())
throw ParserException(mark, ErrorMsg::UNKNOWN_ANCHOR);
auto it = m_anchors.find(name);
if (it == m_anchors.end()) {
std::stringstream ss;
ss << ErrorMsg::UNKNOWN_ANCHOR << name;
throw ParserException(mark, ss.str());
}
return it->second;
}
}
} // namespace YAML

View File

@@ -12,10 +12,10 @@
#include <string>
#include "yaml-cpp/anchor.h"
#include "yaml-cpp/noncopyable.h"
namespace YAML {
class CollectionStack;
template <int> class DepthGuard; // depthguard.h
class EventHandler;
class Node;
class Scanner;
@@ -23,9 +23,13 @@ struct Directives;
struct Mark;
struct Token;
class SingleDocParser : private noncopyable {
class SingleDocParser {
public:
SingleDocParser(Scanner& scanner, const Directives& directives);
SingleDocParser(const SingleDocParser&) = delete;
SingleDocParser(SingleDocParser&&) = delete;
SingleDocParser& operator=(const SingleDocParser&) = delete;
SingleDocParser& operator=(SingleDocParser&&) = delete;
~SingleDocParser();
void HandleDocument(EventHandler& eventHandler);
@@ -43,23 +47,25 @@ class SingleDocParser : private noncopyable {
void HandleCompactMap(EventHandler& eventHandler);
void HandleCompactMapWithNoKey(EventHandler& eventHandler);
void ParseProperties(std::string& tag, anchor_t& anchor);
void ParseProperties(std::string& tag, anchor_t& anchor,
std::string& anchor_name);
void ParseTag(std::string& tag);
void ParseAnchor(anchor_t& anchor);
void ParseAnchor(anchor_t& anchor, std::string& anchor_name);
anchor_t RegisterAnchor(const std::string& name);
anchor_t LookupAnchor(const Mark& mark, const std::string& name) const;
private:
int depth = 0;
Scanner& m_scanner;
const Directives& m_directives;
std::unique_ptr<CollectionStack> m_pCollectionStack;
typedef std::map<std::string, anchor_t> Anchors;
using Anchors = std::map<std::string, anchor_t>;
Anchors m_anchors;
anchor_t m_curAnchor;
};
}
} // namespace YAML
#endif // SINGLEDOCPARSER_H_62B23520_7C8E_11DE_8A39_0800200C9A66

View File

@@ -111,24 +111,15 @@ static UtfIntroState s_introTransitions[][uictMax] = {
static char s_introUngetCount[][uictMax] = {
// uict00, uictBB, uictBF, uictEF, uictFE, uictFF, uictAscii, uictOther
{0, 1, 1, 0, 0, 0, 0, 1},
{0, 2, 2, 2, 2, 2, 2, 2},
{3, 3, 3, 3, 0, 3, 3, 3},
{4, 4, 4, 4, 4, 0, 4, 4},
{1, 1, 1, 1, 1, 1, 1, 1},
{1, 1, 1, 1, 1, 1, 1, 1},
{2, 2, 2, 2, 2, 0, 2, 2},
{2, 2, 2, 2, 0, 2, 2, 2},
{0, 1, 1, 1, 1, 1, 1, 1},
{0, 2, 2, 2, 2, 2, 2, 2},
{1, 1, 1, 1, 1, 1, 1, 1},
{1, 1, 1, 1, 1, 1, 1, 1},
{0, 2, 2, 2, 2, 2, 2, 2},
{0, 3, 3, 3, 3, 3, 3, 3},
{4, 4, 4, 4, 4, 4, 4, 4},
{2, 0, 2, 2, 2, 2, 2, 2},
{3, 3, 0, 3, 3, 3, 3, 3},
{1, 1, 1, 1, 1, 1, 1, 1},
{0, 1, 1, 0, 0, 0, 0, 1}, {0, 2, 2, 2, 2, 2, 2, 2},
{3, 3, 3, 3, 0, 3, 3, 3}, {4, 4, 4, 4, 4, 0, 4, 4},
{1, 1, 1, 1, 1, 1, 1, 1}, {1, 1, 1, 1, 1, 1, 1, 1},
{2, 2, 2, 2, 2, 0, 2, 2}, {2, 2, 2, 2, 0, 2, 2, 2},
{0, 1, 1, 1, 1, 1, 1, 1}, {0, 2, 2, 2, 2, 2, 2, 2},
{1, 1, 1, 1, 1, 1, 1, 1}, {1, 1, 1, 1, 1, 1, 1, 1},
{0, 2, 2, 2, 2, 2, 2, 2}, {0, 3, 3, 3, 3, 3, 3, 3},
{4, 4, 4, 4, 4, 4, 4, 4}, {2, 0, 2, 2, 2, 2, 2, 2},
{3, 3, 0, 3, 3, 3, 3, 3}, {1, 1, 1, 1, 1, 1, 1, 1},
};
inline UtfIntroCharType IntroCharTypeOf(std::istream::int_type ch) {
@@ -160,7 +151,8 @@ inline UtfIntroCharType IntroCharTypeOf(std::istream::int_type ch) {
inline char Utf8Adjust(unsigned long ch, unsigned char lead_bits,
unsigned char rshift) {
const unsigned char header = ((1 << lead_bits) - 1) << (8 - lead_bits);
const unsigned char header =
static_cast<unsigned char>(((1 << lead_bits) - 1) << (8 - lead_bits));
const unsigned char mask = (0xFF >> (lead_bits + 1));
return static_cast<char>(
static_cast<unsigned char>(header | ((ch >> rshift) & mask)));
@@ -192,17 +184,20 @@ inline void QueueUnicodeCodepoint(std::deque<char>& q, unsigned long ch) {
Stream::Stream(std::istream& input)
: m_input(input),
m_mark{},
m_charSet{},
m_readahead{},
m_pPrefetched(new unsigned char[YAML_PREFETCH_SIZE]),
m_nPrefetchedAvailable(0),
m_nPrefetchedUsed(0) {
typedef std::istream::traits_type char_traits;
using char_traits = std::istream::traits_type;
if (!input)
return;
// Determine (or guess) the character-set by reading the BOM, if any. See
// the YAML specification for the determination algorithm.
char_traits::int_type intro[4];
char_traits::int_type intro[4]{};
int nIntroUsed = 0;
UtfIntroState state = uis_start;
for (; !s_introFinalState[state];) {
@@ -279,9 +274,11 @@ char Stream::get() {
// . Extracts 'n' characters from the stream and updates our position
std::string Stream::get(int n) {
std::string ret;
ret.reserve(n);
for (int i = 0; i < n; i++)
ret += get();
if (n > 0) {
ret.reserve(static_cast<std::string::size_type>(n));
for (int i = 0; i < n; i++)
ret += get();
}
return ret;
}
@@ -332,7 +329,7 @@ bool Stream::_ReadAheadTo(size_t i) const {
void Stream::StreamInUtf8() const {
unsigned char b = GetNextByte();
if (m_input.good()) {
m_readahead.push_back(b);
m_readahead.push_back(static_cast<char>(b));
}
}
@@ -353,7 +350,9 @@ void Stream::StreamInUtf16() const {
// Trailing (low) surrogate...ugh, wrong order
QueueUnicodeCodepoint(m_readahead, CP_REPLACEMENT_CHARACTER);
return;
} else if (ch >= 0xD800 && ch < 0xDC00) {
}
if (ch >= 0xD800 && ch < 0xDC00) {
// ch is a leading (high) surrogate
// Four byte UTF-8 code point
@@ -378,11 +377,10 @@ void Stream::StreamInUtf16() const {
// Easiest case: queue the codepoint and return
QueueUnicodeCodepoint(m_readahead, ch);
return;
} else {
// Start the loop over with the new high surrogate
ch = chLow;
continue;
}
// Start the loop over with the new high surrogate
ch = chLow;
continue;
}
// Select the payload bits from the high surrogate
@@ -445,4 +443,4 @@ void Stream::StreamInUtf32() const {
QueueUnicodeCodepoint(m_readahead, ch);
}
}
} // namespace YAML

View File

@@ -7,7 +7,6 @@
#pragma once
#endif
#include "yaml-cpp/noncopyable.h"
#include "yaml-cpp/mark.h"
#include <cstddef>
#include <deque>
@@ -17,11 +16,18 @@
#include <string>
namespace YAML {
class Stream : private noncopyable {
class StreamCharSource;
class Stream {
public:
friend class StreamCharSource;
Stream(std::istream& input);
Stream(const Stream&) = delete;
Stream(Stream&&) = delete;
Stream& operator=(const Stream&) = delete;
Stream& operator=(Stream&&) = delete;
~Stream();
operator bool() const;
@@ -71,6 +77,6 @@ inline bool Stream::ReadAheadTo(size_t i) const {
return true;
return _ReadAheadTo(i);
}
}
} // namespace YAML
#endif // STREAM_H_62B23520_7C8E_11DE_8A39_0800200C9A66

View File

@@ -7,16 +7,20 @@
#pragma once
#endif
#include "yaml-cpp/noncopyable.h"
#include "yaml-cpp/noexcept.h"
#include "stream.h"
#include <cstddef>
namespace YAML {
class StreamCharSource {
public:
StreamCharSource(const Stream& stream) : m_offset(0), m_stream(stream) {}
StreamCharSource(const StreamCharSource& source)
: m_offset(source.m_offset), m_stream(source.m_stream) {}
~StreamCharSource() {}
StreamCharSource(const StreamCharSource& source) = default;
StreamCharSource(StreamCharSource&&) YAML_CPP_NOEXCEPT = default;
StreamCharSource& operator=(const StreamCharSource&) = delete;
StreamCharSource& operator=(StreamCharSource&&) = delete;
~StreamCharSource() = default;
operator bool() const;
char operator[](std::size_t i) const { return m_stream.CharAt(m_offset + i); }
@@ -27,8 +31,6 @@ class StreamCharSource {
private:
std::size_t m_offset;
const Stream& m_stream;
StreamCharSource& operator=(const StreamCharSource&); // non-assignable
};
inline StreamCharSource::operator bool() const {
@@ -38,11 +40,11 @@ inline StreamCharSource::operator bool() const {
inline const StreamCharSource StreamCharSource::operator+(int i) const {
StreamCharSource source(*this);
if (static_cast<int>(source.m_offset) + i >= 0)
source.m_offset += i;
source.m_offset += static_cast<std::size_t>(i);
else
source.m_offset = 0;
return source;
}
}
} // namespace YAML
#endif // STREAMCHARSOURCE_H_62B23520_7C8E_11DE_8A39_0800200C9A66

View File

@@ -6,7 +6,8 @@
#include "token.h"
namespace YAML {
Tag::Tag(const Token& token) : type(static_cast<TYPE>(token.data)) {
Tag::Tag(const Token& token)
: type(static_cast<TYPE>(token.data)), handle{}, value{} {
switch (type) {
case VERBATIM:
value = token.value;
@@ -28,7 +29,7 @@ Tag::Tag(const Token& token) : type(static_cast<TYPE>(token.data)) {
}
}
const std::string Tag::Translate(const Directives& directives) {
std::string Tag::Translate(const Directives& directives) {
switch (type) {
case VERBATIM:
return value;
@@ -46,4 +47,4 @@ const std::string Tag::Translate(const Directives& directives) {
}
throw std::runtime_error("yaml-cpp: internal error, bad tag type");
}
}
} // namespace YAML

View File

@@ -23,7 +23,7 @@ struct Tag {
};
Tag(const Token& token);
const std::string Translate(const Directives& directives);
std::string Translate(const Directives& directives);
TYPE type;
std::string handle, value;

View File

@@ -14,10 +14,11 @@
namespace YAML {
const std::string TokenNames[] = {
"DIRECTIVE", "DOC_START", "DOC_END", "BLOCK_SEQ_START", "BLOCK_MAP_START",
"BLOCK_SEQ_END", "BLOCK_MAP_END", "BLOCK_ENTRY", "FLOW_SEQ_START",
"FLOW_MAP_START", "FLOW_SEQ_END", "FLOW_MAP_END", "FLOW_MAP_COMPACT",
"FLOW_ENTRY", "KEY", "VALUE", "ANCHOR", "ALIAS", "TAG", "SCALAR"};
"DIRECTIVE", "DOC_START", "DOC_END", "BLOCK_SEQ_START",
"BLOCK_MAP_START", "BLOCK_SEQ_END", "BLOCK_MAP_END", "BLOCK_ENTRY",
"FLOW_SEQ_START", "FLOW_MAP_START", "FLOW_SEQ_END", "FLOW_MAP_END",
"FLOW_MAP_COMPACT", "FLOW_ENTRY", "KEY", "VALUE",
"ANCHOR", "ALIAS", "TAG", "SCALAR"};
struct Token {
// enums
@@ -48,12 +49,12 @@ struct Token {
// data
Token(TYPE type_, const Mark& mark_)
: status(VALID), type(type_), mark(mark_), data(0) {}
: status(VALID), type(type_), mark(mark_), value{}, params{}, data(0) {}
friend std::ostream& operator<<(std::ostream& out, const Token& token) {
out << TokenNames[token.type] << std::string(": ") << token.value;
for (std::size_t i = 0; i < token.params.size(); i++)
out << std::string(" ") << token.params[i];
for (const std::string& param : token.params)
out << std::string(" ") << param;
return out;
}
@@ -64,6 +65,6 @@ struct Token {
std::vector<std::string> params;
int data;
};
}
} // namespace YAML
#endif // TOKEN_H_62B23520_7C8E_11DE_8A39_0800200C9A66

View File

@@ -95,7 +95,7 @@
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
<InlineFunctionExpansion>Disabled</InlineFunctionExpansion>
<AdditionalIncludeDirectories>$(SolutionDir)3rdparty\yaml-cpp\include\;$(SolutionDir)3rdparty\yaml-cpp\src\;</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;_WINDOWS;_DEBUG;_ITERATOR_DEBUG_LEVEL=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>YAML_CPP_STATIC_DEFINE;WIN32;_WINDOWS;_DEBUG;_ITERATOR_DEBUG_LEVEL=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
</ClCompile>
</ItemDefinitionGroup>
@@ -107,7 +107,7 @@
</SDLCheck>
<AdditionalIncludeDirectories>$(SolutionDir)3rdparty\yaml-cpp\include\;$(SolutionDir)3rdparty\yaml-cpp\src\;</AdditionalIncludeDirectories>
<InlineFunctionExpansion>Disabled</InlineFunctionExpansion>
<PreprocessorDefinitions>WIN32;_WINDOWS;_DEBUG;_ITERATOR_DEBUG_LEVEL=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>YAML_CPP_STATIC_DEFINE;WIN32;_WINDOWS;_DEBUG;_ITERATOR_DEBUG_LEVEL=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
</ClCompile>
</ItemDefinitionGroup>
@@ -120,7 +120,7 @@
<SDLCheck>
</SDLCheck>
<AdditionalIncludeDirectories>$(SolutionDir)3rdparty\yaml-cpp\include\;$(SolutionDir)3rdparty\yaml-cpp\src\;</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>YAML_CPP_STATIC_DEFINE;WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
</ClCompile>
<Link>
@@ -137,7 +137,7 @@
<SDLCheck>
</SDLCheck>
<AdditionalIncludeDirectories>$(SolutionDir)3rdparty\yaml-cpp\include\;$(SolutionDir)3rdparty\yaml-cpp\src\;</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>YAML_CPP_STATIC_DEFINE;WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
</ClCompile>
<Link>
@@ -174,6 +174,7 @@
<ClCompile Include="src\contrib\graphbuilder.cpp" />
<ClCompile Include="src\contrib\graphbuilderadapter.cpp" />
<ClCompile Include="src\convert.cpp" />
<ClCompile Include="src\depthguard.cpp" />
<ClCompile Include="src\directives.cpp" />
<ClCompile Include="src\emit.cpp" />
<ClCompile Include="src\emitfromevents.cpp" />

Some files were not shown because too many files have changed in this diff Show More