I have been using the income variables incwage, incfarm and incbus from the CPS ASEC samples from 1980 to 2017. I tried to harmonize the topcoding method by replacing the topcoding method in 19762010 with the “Rank proximity swap values” method using the “swapvalues” file (https://cps.ipums.org/cps/income_cell_means.shtml). However, when I looked through the values of the variables in the swapvalues file, in several instances incwage_swap has a value that’s much lower than the topcode. For example, in the 2005 ASEC sample serial 930, pernum 2, has a value of $40,000 for incwage_swap. This is well below the topcode threshold for that variable in that year. (This problem also seems to have been reported here: Topcode Replacement Values IPMUS CPS ASEC).
The problem seems to be that in some cases, oincwage has crossed the topcode while inclongj has not (so we have some positive number for oincwage_swap and a zero for inclong_swap). But when the incwage_swap variable is constructed, it seems to have added oincwage_swap and inclongj_swap  instead of adding oincwage_swap and inclongj. Again taking (serial 930, pernum 2) in 2005 ASEC as an example:
inclongj = 50,000
oincwage = 77282
incwage = 127282 (srcearn=1)
inclongj_swap = 0
oincwage_swap = 40,000
incwage_swap = 40,000
In this case, shouldn’t the correct value for incwage_swap be 90,000?
To get at the correct value for incwage, would this be a reasonable way to proceed? 

replace oincwage with oincwage_swap for nonzero values of oincwage_swap

replace inclongj with inclongj_swap for nonzero values of inclongj_swap

let incwage = oincwage + inclongj (if srcearn==1) and incwage = oincwage (otherwise).
I don’t have if I have misunderstood or missed something about harmonizing the topcoding method. Thank you for your time!