BoostC is my personal favorite, you can get it at
http://www.sourceboost.com
It's quite a bit like CC5x, but its free version is not as limited, and the full versions are SIGNIFICANTLY less expensive.
Oznog, I can't say much without knowing more about what your program was trying to do, but I do think I will point out that in the end, we're still working on a PIC. I've seen some complaints about certain compilers that they don't work with some of the fancier features of C (or even C++), but often if you think about how that feature would get implemented in assembly, it can get very messy and inefficient, so I don't feel it's heresy to be excluding a few parts of C if they simply don't "belong" on a PIC. On the flip side, there are also a few features that are NOT part of C that are very helpful to include in a PIC "C" compiler... an example being the method of bit accessing that is used in CC5x: if you want to set bit 7 of variable ABC, instead of doing bitwise operations or anything, you can simply do ABC.7=1;
When I first switched to BoostC, they didn't have that feature, and when I suggested it, they were reluctant because it wasn't a standard C operation, but enough people seemed to agree that it was convenient and it's now in there. In the end, you have to fit the tool to the job.
I use C on the PIC because it takes less time to write the code, there's less housekeeping and it's easier to follow than assembly, but at the same time I avoid many of the features of standard C that I think would not port well to assembly.
However, if the features it is missing WOULD port well to assembly, and they just never got done because the developers were lazy, then yes, I would definitely find fault with that. And, based on the times that I tried out CCS, I did not like it very much either. In the same way that I avoid standard C features that are abstracted way away from the assembly level, I also do not like using proprietary functions of the compiler - and CCS seems to make heavy use of these types of functions, where it seems like every time you want to do anything you have to call set_bit() or shift_left() or output_low() or whatever. Not only does that mean the code is not portable to other compilers, but I also don't like not knowing exactly what they're doing, because that's when unexpected things happen.