With a\b representing integer division and a%b the remainder of this division:
blocks_per_epoch = 210000;
initial_reward = 5 * 10^9;
current_epoch = current_block_height \ blocks_per_epoch;
blocks_in_current_epoch = (current_block_height % blocks_per_epoch) + 1;
current_reward = initial_reward / 2 ^ (current_epoch);
total_coins = 2 * blocks_per_epoch * (initial_reward - current_reward) +
blocks_in_current_epoch * current_reward;
Note that this can be off by a few satoshis due to a different rounding.
If you work with integers for the reward, the division for current_reward can be replaced with a bitshift. If not, you can change initial_reward to 50 to give result in BTC instead of satoshis.